目录:
1.顺序表的定义
2.顺序表的实现
1.顺序表的定义
什么是顺序表?知:C语言中,数组的长度是在创建之初就已经确定了的,但是,若数组创建前,无法确定该数组需要使用的长度,该为数组开多大的空间呢?是为确保空间足够大,开1000?10000?还是更大?还是为避免浪费,开的空间小一点?
面临该情形,我们可以做个猜想,能否使数组起初开辟的空间较小,当数组满了,空间不够用了,再给它扩容呢?
由于数组的大小是可能改变的,所以我们需要一个变量——能够告诉我们此时数组的大小,我们给它起名capacity(容量);我们还需要另一个变量——能够告诉我们数组已经存放了多少个元素,我们叫它size(个数)。
那么,由一个可变数组,两个变量组成的一个整体,将其放入一个结构体中,我们就称这个结构体为动态顺序表。如图:
![](https://img-blog.csdnimg.cn/aa7bc1894f1b4fc49e02661fb1c98db1.png)
图中SL是顺序表(sequence list)的简称,Datetype意为顺序表数组内元素的类型 由于数组内的元素可以是int,char,double...等类型 所以我们不要将其写死,用#define 来定义其数据类型,方便我们日后更改。
2.顺序表的实现
该如何实现这个动态顺序表呢?或者说,如果我们想对这个顺序表进行增,删,查,改等功能要怎么做呢?
用函数,用一个个函数去完成上述的功能,如下为函数的声明
![](https://img-blog.csdnimg.cn/4aa6f65ce7a644d3b218ff5a005bd26a.png)
首先,何为初始化顺序表?即为顺序表内的变量(可变数组或者说指针,size和capacity)赋一个初始值,要想使该数组能够扩容,我们就需要使用动态内存开辟的空间,初始时可以先开辟四个元素的空间,此时该数组的capacity(容积)为4,数组内暂无元素,故size为0,所以该函数的定义如下:
![](https://img-blog.csdnimg.cn/5620f21e39ec4a83bca2b1614b3cc59f.png)
所谓“有借有还”,当数组用完之后,咱总得把借来的空间给还回去吧?这就是销毁顺序表该干的事儿了,那么如何"还"回来? 简单,把开辟的空间free掉,此时这个数组已经“名存实亡”了,那么它的size(元素个数)就是0,capacity(容积)也是0,为了让它的"名"不被误用,咱们就把它的“名”也给弃除,即将arr置为空(NULL),函数定义如下:
![](https://img-blog.csdnimg.cn/e129dbc489ff42e5831817ec6b832479.png)
我们初始时给数组开辟了四个元素大小的空间,前几次增添元素可能没事,但总有一次数组会满,所以我们需要一个函数来为我们判断数组是否满了,判断标准是啥呢?首先,我们已经知道当前数组的元素个数(size)和数组的容积(capacity),那么当size==capacity时,数组不就满了吗?数组满了,咱们就需要扩容,一次扩充一倍的空间最为合适,同时更新扩容后数组的容积(capacity),函数定义如下:
![](https://img-blog.csdnimg.cn/cbd0ff1a2ebd48dead8029d562624ba8.png)
增添元素函数——SLInsert(
SL*
psl,
int
pos,
SLDatatype
x);首先,增添元素之前,需要调用函数来判断数组是否已经满了。为数组增添元素的位置有很多,可能是数组的开头,又可能是数组的末尾,也可能是数组中间的人一个位置,所以我们用pos来表示为数组增添元素的位置,同时判断所给的pos是否合法,要知道咱们是增添元素而不是更改元素,所以需要将pos位置及其后面的元素后移一个位置,然后再将pos位置赋值为目标元素x,完成上述操作后,数组的元素个数+1,数组容积不变,函数定义如下:
![](https://img-blog.csdnimg.cn/2e732fd5c56846eea5b9024294ba8ff8.png)
删除元素函数,首先,将数组元素遍历一遍找到目标元素的位置,然后删除目标元素。元素的删除就是覆盖,从左往右移一个位置将目标元素覆盖即可,覆盖完成后,数组的元素个数-1,容积不变,函数定义如下:
![](https://img-blog.csdnimg.cn/7234a433cd4644a39fc42242e8a133e8.png)
查找元素,即将数组内的元素遍历一遍寻找目标元素,然后直接返回目标元素的下标即可。若遍历一遍后找不到目标元素,则在最后返回-1,函数的定义如下:
![](https://img-blog.csdnimg.cn/ac33319ecb7b4d619e84b3c6e7a42e5d.png)
改变元素,首先需要判断所给的位置是否合法,然后直接在数组中,将所给位置的元素覆盖成所给值即可,函数的定义如下:
![](https://img-blog.csdnimg.cn/66d57ca34bb14f34a8afcb77db19e149.png)
现在该顺序表就已经实现完成啦,试试效果?试试增添元素(0~9)
代码+运行结果:
![](https://img-blog.csdnimg.cn/ea98260289fa43abb3e5b7cfa3694ff1.png)