顺序表专题
目录
一.创建3个文件
二.顺序表分类
1.静态顺序表
2.动态顺序表
三.初始化
3.1头文件中:
3.2源文件中:
3.3测试文件中:
四.空间释放
4.1头文件中:
4.2源文件中
4.3测试文件中
五.尾插
5.1头文件:
5.2源文件:
5.3测试文件:
六.头插
6.1头文件中:
6.2源文件中:
6.3测试文件:
七.打印
7.1头文件:编辑
7.2源文件:
7.3测试文件:
八.尾删
8.1头文件:编辑
8.2源文件:
8.3测试文件:编辑
九.头删
9.1头文件
9.2源文件
9.3测试文件
一.创建3个文件
1.分别是 头文件SeqList.h 源文件SeqList.c 测试文件test.c
2.分别的作用/负责内容:
- 头文件SeqList.h:定义顺序表结构,声明顺序表方法
- 源文件SeqList.c:实现顺序表方法
- 测试文件test.c:进行测试
二.顺序表分类
1.静态顺序表
- 顺序表结构有:定长数组,有效数据
2.动态顺序表
- 顺序表结构有:指针,有效数据,空间大小
tip:优先使用动态顺序表。原因:更灵活,可以动态的申请空间。
因为:空间大了,会导致 资源浪费;空间小了,会导致 资源不够。
注意:动态顺序表中,进行每一部分操作都得分别一一测试,不可所有写完整体测试!易混淆。
三.初始化
3.1头文件中:
解释:
- Typedef首先是给顺序表重命名为SL。
- 其次指针类型不一定只有整型的,所以重命名为SLDataType,这样写后续也方便修改补充。
- 能用到的头文件,写在开头
3.2源文件中:
解释:
- 首先源文件中要写引用的头文件。
- 初始化,会对顺序表中内容有所变动,所以需要传址调用而非传值调用,因为传值调用只会对副本进行修改,对原对象(测试文件中的实参)不会有所影响。
3.3测试文件中:
解释:
- 定义一个顺序表变量,将它的地址传址调用给源文件中的SLInit函数。
- tip:你可以将这里的sl想象成一个用户,将该用户的地址传给源文件中的初始化函数,它可以通过这个用户地址,找到顺序表,就可以对顺序表中的成员进行初始化。
四.空间释放
4.1头文件中:
4.2源文件中
解释:
- 依然是传址,原因同上。
- 空间释放是因为向内存申请空间后,使用完毕需要释放归还。(不懂就去看我博客-C语言专栏-动态内存管理)
4.3测试文件中
- 注意:测试文件中的主函数不变,依然是上图3.3,后续不再解释。上面的4.3这里只展示新增加的代码。
五.尾插
5.1头文件:
解释:
- 参数部分分别是:指向顺序表结构体的指针,要插入顺序表尾部的元素
5.2源文件:
解释:
- 尾插的原理分析图:
- 首先无论是尾插还是头插,都得先assert断言,防止测试文件中传NULL。如果是NULL,则报错。
- 其次无论是头插还是尾插,在插入之前得判断空间是否足够,不够了就得动态申请空间。
- 使用realloc来动态申请空间,原因:在原有空间基础上进行增容。
- 那么,要申请多大空间/一次增容多大?实际上数学推理出来,增容通常来说,一般是2到3倍。
- 注意:不能频繁增容,否则程序运行效率会大大降低。但是!也不能一下增容特别大空间(比如4000),因为空间给小会不够用,空间给大会造成资源浪费,所以2倍2倍的给(4--8--16--32......)。
- 217行动态申请空间,得首先考虑到空间capacity是否为0(用三目操作符判断),所以210行。
- 当然,申请好空间后,还要判断是否申请成功了,如果失败,则返回的是NULL。所以219~223。如果判断好不是NULL,说明申请成功,则225。
- 注意;213~214写法错误(注释部分),因为我们并不知道是否能成功申请空间,如果失败了,则arr之前的空间也一并不见了,所以realloc申请的空间不能返回给ps->arr,我们可以先返回给一个临时变量tmp。
- 申请好空间之后再尾插。230行。
5.3测试文件:
六.头插
6.1头文件中:
解释:
- 尾插就是插在下标为size的地方,头插就是插在下标为0的地方
6.2源文件中:
解释:
- 头插原理分析图:
- 首先无论头插还是尾插,都要assert断言和判断空间够不够。
- 然后就是通过for循环,让顺序表中已有的数据整体往后挪动一位。
- arr[0]空出来了,现在插入x就可以了。225行。
6.3测试文件:
七.打印
7.1头文件:

7.2源文件:
7.3测试文件:
假如用于尾差的打印测试:
八.尾删
8.1头文件:

解释:
- 为什么没有像尾插/头插那样有第2个参数?因为这里是删除数据,不是插入数据。
8.2源文件:
解释:
- 尾删原理分析图:
- 首先得assert断言一下,其次203行的assert是为了判断顺序表是否为空,如果为空就不能进行删除操作。
- 206这一行后来注释掉了,因为只要size被正确更新,从顺序表的角度看,就已经完成了尾删。206行就显的有点多余,直接有150行的--size就行了。后续多出来的项也会被新元素覆盖,不会有其他影响。
- 最后记住size-1
8.3测试文件:

九.头删
9.1头文件
9.2源文件
解释:
- 首先是assert断言和判断顺序表是否为空。
- 然后for循环将每个元素往前移。
- 最后记住:size会-1