本期我们主要讨论动态顺序表
这个内容可以分为三个部分
1.创建头文件进行函数声明
2.创建源文件进行函数定义
3.创建主文件进行测试
我们先来看看头文件里的函数声明:
函数声明:
头文件中包括<stdlib.h>库函数用于进行动态内存管理,assert用于警告退出。
SLDataType为顺序表中存储的元素类型,typedef int,即将int类型取个名字叫做SLDataType。与宏相反,例如define int SLDataType为将int转为SLDataType,而typedef是将SLDataType转为int。
SeqList为我们创建的顺序表,三个参数分别为
1.存储的元素指针类型(即首地址),相当于创建这种元素类型的数组,后面我们可以通过动态内存为这个地址开始分配空间。
2.现在在数组中存放的元素个数。
3.数组的空间容量,即可以存储多少个这种类型的元素。
接下来几个函数用途分别为初始化,销毁,输出,扩容,尾插,尾删除,头插,头删除操作。
函数定义:
函数定义的源文件中我们要包含声明的头文件,之后在开始对函数进行定义。
初始化函数:
传入顺序表的地址。
#注意:必须传入地址,传入的如果是顺序表本身的话只是对原顺序表的一份拷贝,无法队员顺序表进行修改。
将顺序表的数组地址设置为空。
将顺序表的元素个数设置为0。
将顺序表的空间大小设置为0.
销毁函数:
因为是动态顺序表,使用的空间是向操作系统借的,所以用完之后需要释放。
如果数组首地址不为空,则释放数组。
之后:
将顺序表的数组地址设置为空。
将顺序表的元素个数设置为0。
将顺序表的空间大小设置为0.
这一步其实可以直接用初始化函数完成。
输出函数:
按照正常的方式输出数组即可。
空间分配函数(重点):
如果已存放的元素个数等于数组可存放元素个数,则需要再分配空间。
此时有两种可能:
1.如果数组本身没有空间,则需要给他一个空间。
2.如果数组本身有空间,只需要将数组空间翻倍即可。
我们使用newcapacity来记录新空间的大小,并创建一个指针来记录开辟空间的首地址。
如果成功开辟空间,则将新空间传给顺序表,顺序表的数组地址改为新空间的地址,可存放元素个数改为newcapacity。
如果没有成功开辟,则产生警告,退出程序。
注意:过了两天博主发现这里写了两个bug,1是newcapacity,如果原空间为0,那么初始值要设为sizeof(SLDataType)。2是下面的ps->capacity,应该改为newcapacity/sizeof(SLDataType),capacity存的是可以存放的变量个数而不是可以存放的空间大小。
尾插函数:
先使用空间分配函数确保顺序表具有充足的空间,然后将顺序表数组的最后一位改为插入的值,粗放的元素个数size++。
头插函数:
第一步还是要检查数组空间是否足够。
找到顺序表数组最后一个位置
从size位置开始(数组元素最后一位为size-1,在头部插入新的值也就是所有元素后移一位)。
每一位都修改为前一位直到i=0时退出,i此时为第一位,即:将第一位修改为新插入的数x,然后将
存放的元素个数+1即可。
尾删函数:
将最后一位的值修改为-1然后存放的元素个数-1即可。
头删函数:
元素个数减去一,从第一位开始每一位都修改为后一位即可。
插入函数:
这个函数比头插尾插更高级,找到固定位置插入一个数即可。
我这里是pos为第几位,在那一位放上插入数。
查找函数:
用途为找到某个固定的数第一次出现的下标,没出现则返回-1.
汇总:
在我们创建的源文件中包含上我们刚刚定义函数的文件,然后进行运行,设计的符合预想,结束。
#看在博主这么辛苦写文章写代码的份上留个免费的赞吧,谢谢!