接下来我们看怎么完成不定长顺序表的代码实现
这里先加一个头文件,名字叫dsqlist.h,存放不定长顺序表的函数定义与声明
然后建立一个名字叫dsqlist.cpp的源文件,跟其头文件配对成一对,(也可以叫别的名字不配对),配对是为了方便我们自己查找。来存放函数的具体实现
接着我们在头文件里面定义完结构体后,可以先把原来定长顺序表的头文件里的函数操作全部复制到这个头文件里,然后再去实现它。将头文件里的再复制到同名源文件里,记得引用头文件。
这里说一下引用规则
宏 也是一种定义。定义与声明要放在头文件里,所以#define INIT_SIZE 10要写在dsqlist.h里面,用#include "dsqlist.h"来被调用它的文件认识。 这里记得给宏加一个具体的数值,否则如果只写一个#define INIT_SIZE就会出现如下错误
那写完的初始化就是这样
(之前说过函数最好写完一个立马就测一个)
现在来text文件里测试一下,可以看到初始化成功正常运行
二.插入函数(插入数据,在顺序表PS的pos位置插入val数据元素)
如图,有效数据长度为5,即前5个数字01578有效,现在在2号位置插入val值100
跟前面定长顺序表是一样的: 先往后挪数据; 再插入; 最后length++
唯一不一样的一点是:如果插入满了。就需要扩容
,
*数据要放到哪个位置就是把数据的值赋值给哪个位置
*等号插入没有删除有,有效的最后一位后面可以插入不可删除
三.判满函数
判满为什么要用静态函数
像是插入,删除函数这类,是别人(用户)要调用使用的操作。 但是判满函数这种别人是不需要调用的。因为在不定长(可扩容)顺序表里面,是没有满了的概念的。一旦满了就立即扩容,根本不存在满的情况。所以别人在使用这个顺序表的时候,不会出现使用着使用着就因为满了而无法使用的情况,所以别人在使用顺序表时不需要对顺序表判断是否满了的操作。
我们平时在使用顺序表插入信息时,都是直接插入信息,没有说上来第一步先判断这个表满了没,我们使用者要做的就只有插入,判满扩容是人家底层自动就做了的。
上面说的就是对使用者来说,顺序表就没有满的概念,所以不需要判满的操作。
所以静态函数是给谁用的,给我自己用的,别人别想用,那不就是静态函数吗?所以你看是不是在cpp文件的外面跟其配对的.h文件里,是不是就没有个判满,只有个盼空吧。是给我自己用的别人不用,给我自己用就是写一个静态函数。
然后是四.扩容函数,同理仍然是给我自己看的静态函数。
作为使用者来说就怎么样,直接往里面插入数据,删除数据就行了,我管不管你有没有空间,我不管的。你没有空间了,你要是不可扩容的,那我就怎么样,我就插不进去,你要是能扩容,那我就插成功了。我不管,反正你给我个顺序表,我拿来用就行了,所以我们扩容一样是一个静态函数。
而扩容用realloc。
扩容相当于把数据成员elem改动了,一般我们改动某个数据成员时,要思考一下剩下其他的数据成员需不需要跟着改动,不改不影响就不需要改。这里的有效数据的个数不需要改,但总容量就需要改了,扩容后的总容量是原来的2倍
现在测试一下插入并且需要扩容函数,为了显示看到结果,再写一个五.Show输出函数
这里说一点,i++的下一步是判断不是执行,1,2,3,3放着,4执行1,2判断3,符号要求才进4,不符合2,3虽执行但不进4
插入且执行扩容函数测试成功