数据结构基础(顺序表)

顺序表完整代码

      • SeqList.h
      • SeqList.c
      • test.c

SeqList.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>//#define N 1000
//typedef int SLDataType;

 静态顺序表
//typedef struct SeqList {
//	SLDataType a[N];
//	int size;// 数组中存储数据的个数
//}SL;
//
 静态特点:如果满了就不能插入 缺点:多少大小合适?
 接口函数
//void SeqListInit(SL* ps);
//void SeqLIstPushBack(SL* ps, SLDataType x);
//void SeqLIstPopBack(SL* ps);
//void SeqLIstPushFront(SL* ps, SLDataType x);
//void SeqLIstPopFront(SL* ps);typedef int SLDataType;// 不带头节点的单向非循环链表
// 动态顺序表
typedef struct SeqList {SLDataType* a;// 指针指向动态开辟的空间int size;     // 数组中存储数据的个数int capacity; // 数组实际能存储空间的容量
}SL;// 静态特点:如果满了就不能插入 缺点:多少大小合适?
// 接口函数
// 打印
void SeqListPrint(SL* ps);
// 初始化
void SeqListInit(SL* ps);
// 销毁
void SeqListDestory(SL* ps);// 增容
void SeqListCheckCapacity(SL* ps);
// 尾插
void SeqListPushBack(SL* ps, SLDataType x);
// 尾删
void SeqListPopBack(SL* ps);
// 头插
void SeqListPushFront(SL* ps, SLDataType x);
// 头删
void SeqListPopFront(SL* ps);
// ... // 查找x的位置下标,没找到返回-1
int SeqListFind(SL* ps, SLDataType x);
// 在第pos个位置插入
void SeqListInsert(SL* ps, int pos, SLDataType x);
// 删除第pos个位置
void SeqListErase(SL* ps, int pos);
// 修改第pos个位置
void SeqListModify(SL* ps, int pos, SLDataType x);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"// 打印
void SeqListPrint(SL* ps)
{for (int i = 0; i < ps->size; i++)printf("%d ", ps->a[i]);printf("\n");
}// 初始化
void SeqListInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}// 销毁(内存泄漏)
void SeqListDestory(SL* ps)
{free(ps->a);// 释放ps->a = NULL;// 置为空ps->capacity = ps->size = 0;
}// 增容
void SeqListCheckCapacity(SL* ps)
{// 如果没有空间或者空间满了,就扩容if (ps->size == ps->capacity){// 三目操作符,判断第一次的容量是否为0,int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("AddSeqList::%s\n", strerror(errno));// 将错误码转换成错误信息printf("realloc fail\n");exit(-1);// 异常退出返回 -1}ps->a = tmp;// 指向动态开辟的空间ps->capacity = newcapacity;// 新的容量大小}
}// 尾插
void SeqListPushBack(SL* ps, SLDataType x)
{// 检查增容SeqListCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}// 尾删
void SeqListPopBack(SL* ps)
{//if (ps -> size > 0)//{//	ps->size--;//}assert(ps->size > 0);ps->size--;}// 头插
void SeqListPushFront(SL* ps, SLDataType x)
{// 检查增容SeqListCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}// 头删
void SeqListPopFront(SL* ps)
{assert(ps->size > 0);// 判断有没有值int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}// 查找x的位置下标,没找到返回-1
int SeqListFind(SL* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){printf("%d\n", i);return 0;}}return -1;
}// 在第pos个位置插入(pos下标)
void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(pos < ps->size);// 要插入的位置小于顺序表的长度SeqListCheckCapacity(ps);// 检查增容int end = ps->size - 1;// 找到最后一个元素的下标while (end >= pos)// 往后移的循环{ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}
// 删除第pos个位置(pos下标)
void SeqListErase(SL* ps, int pos)
{assert(pos < ps->size);int start = pos + 1;while (start < ps->size){ps->a[start - 1] = ps->a[start];start++;}ps->size--;
}// 修改第pos个位置
void SeqListModify(SL* ps, int pos, SLDataType x)
{assert(pos < ps->size);ps->a[pos] = x;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"void TestSeqList1()
{SL s1;SeqListInit(&s1);// 址传递,形参改变实参SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);//SeqListPopBack(&s1);//SeqListPopBack(&s1);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);SeqListDestory(&s1);
}void TestSeqList2()
{SL s1;SeqListInit(&s1);// 址传递,形参改变实参SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);SeqListPushFront(&s1, 10);SeqListPushFront(&s1, 20);SeqListPushFront(&s1, 30);SeqListPushFront(&s1, 40);SeqListPushFront(&s1, 50);SeqListPrint(&s1);SeqListPopFront(&s1);SeqListPopFront(&s1);SeqListPrint(&s1);// !!!如果越界了,一般是不会报错的SeqListDestory(&s1);// 动态申请的内存,在释放内存时才会检查是否越界
}
void TestSeqList3()
{SL s1;SeqListInit(&s1);// 址传递,形参改变实参SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);//SeqListInsert(&s1, 1,20);//SeqListPrint(&s1);//SeqListErase(&s1, 1);//SeqListPrint(&s1);SeqListFind(&s1, 4);SeqListModify(&s1, 1, 30);SeqListPrint(&s1);SeqListDestory(&s1);}int main()
{//TestSeqList1();//TestSeqList2();TestSeqList3();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python+Requests对图片验证码的处理

Requests对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过request做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过request对图片验…

Vscode中字符串报错:Unknown word.cSpell

一. 报错现象 二. 原因 是vscode IDE工具中的插件 Code Spell Checker 会检查字符串的合理性&#xff0c;我们写的中式拼音的字符串&#xff0c;不是一个标准英文单词&#xff0c;就会提示错误&#xff0c;解决方法就是让该插件遇到特定词汇不报错 三. 解决方法

macOS本地调试k8s源码

目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…

TCP_报文格式解读

报文格式 header部分字段含义解析 固定字段 对于header中固定部分字段含义&#xff0c;见之前的blog《TCP报文分析》&#xff1b; 对部分字段含义补充说明 Data Offset&#xff1a;4bit&#xff0c;tcp header的长度&#xff0c;单位&#xff1a;32bit&#xff08;4字节&…

指针(3)

如图&#xff0c;这是比较常见的冒泡排序&#xff0c;不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。 如果我们想对任何数据进行排序&#xff0c;我们可以发现&#xff0c;排序的趟数是固定的&#xff0c;我们只需要对比较大…

大数据Doris(三十一):Doris简单查询

文章目录 Doris简单查询 一、简单查询 二、Join

linux(3)之buildroot配置软件包

Linux(3)之buildroot配置软件包 Author&#xff1a;Onceday Date&#xff1a;2023年11月30日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Buildroot - Making Embedded Linux Easymdev.txt docs - busybox - BusyBox: The Swiss Army Knife of Embedded Linu…

组合(回溯+剪枝、图解)

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],…

Unittest单元测试之unittest用例执行顺序

unittest用例执行顺序 当在一个测试类或多个测试模块下&#xff0c;用例数量较多时&#xff0c;unittest在执行用例 &#xff08;test_xxx&#xff09;时&#xff0c;并不是按从上到下的顺序执行&#xff0c;有特定的顺序。 unittest框架默认根据ACSII码的顺序加载测试用例&a…

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)

时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标) 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测(多图,多指标)预测效果基本介绍环境准备程序设计参考资料预测效果 基本介绍

ChatGPT一周年,奥特曼官宣 OpenAI 新动作!

大家好&#xff0c;我是二狗。 今天是11月30日&#xff0c;一转眼&#xff0c;ChatGPT 发布已经一周年了&#xff01; 而就在刚刚&#xff0c;ChatGPT一周年之际。 OpenAI 正式宣布Sam Altman回归重任CEO, Mira Murati 重任CTO&#xff0c;Greg Brockman重任总裁&#xff0c;O…

无需繁琐编程 开启高效数据分析之旅!

不学编程做R统计分析&#xff1a;图形界面R Commander官方手册 R Commander是 R 的图形用户界面&#xff0c;不需要键入命令就可通过熟悉的菜单和对话框来访问 R 统计软件。 R 和 R Commander 均可免费安装于所有常见的操作系统——Windows、Mac OS X 和 Linux/UNIX。 本书作…

LeetCode Hot100 169.多数元素

题目&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 方法一&#xff1a;哈希表 ​ class Solution {public int…

【android开发-06】android中textview,button和edittext控件的用法介绍

1&#xff0c;TextView控件使用代码参考用例 在Android中&#xff0c;我们通常使用XML来定义布局和设置视图属性。以下是一个TextView的XML布局设置示例&#xff1a; 1.1在res/layout目录下的activity_main.xml文件中定义一个TextView&#xff1a; <TextView android:id…

FATFS基本入门教程(2)-什么是文件系统

作者注&#xff1a;FATFS应该是一个比较常用的嵌入式文件系统&#xff0c;支持FAT12/FAT16/FAT32/EXFAT格式&#xff0c;很多开发人员都用过。我在这里会写一系列文章来介绍FATFS的基本使用&#xff0c;欢迎感兴趣的同学关注。 已发布的内容&#xff1a; FATFS基本入门指南&…

wordpress安装之Linux ftp传输

工欲善其事,必先利其器。 最近准备在自己的服务器上搭建一个个人技术分享的平台。 因为我发现现在网络上的工具呀&#xff0c;还有一些问题的解答总是模棱两可&#xff0c;所以我打算自己做一个。 首先呢&#xff0c;我们需要有一个linxu的系统当服务器&#xff0c;然后呢&a…

Windows安装Mysql Workbench及常用操作

Mysql Workbench是mysql自带的可视化操作界面&#xff0c;功能是强大的&#xff0c;但界面和navicat比&#xff0c;就是觉得别扭&#xff0c;但其实用惯了也还好&#xff0c;各有特色吧。这里记录一下常用的操作。 官方手册&#xff1a;MySQL Workbench 一、安装 1. 下载 官方…

C/C++的常见内存问题

1 内存泄漏&#xff1a;动态分配的内存没有被正确释放&#xff0c;导致程序持续占用内存直至结束运行。 Example: void memoryLeakExample() {int* ptr new int(5); // 分配了一个int类型的内存// 这里没有调用delete来释放内存 } solution: 自己delete或者使用智能指…

RPG项目01_场景及人物动画管理器

基于“RPG项目01_UI登录”&#xff0c;新建一个文件夹名为Model&#xff08;模型&#xff09; 将资源场景拖拽至Model中 找到相应场景双击进入 红色报错部分Clear清掉即可&#xff0c;我们可以重做 接下来另存场景 起名为Game 点击保存 场景就保存至Scene中了 在文件夹下新创建…

探究Kafka原理-4.API使用

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…