一,顺序表的结构
顺序表是线性表的一种,它的底层逻辑是数组,所以顺序表它在 物理结构 和 逻辑结构上都是线性的。
二,顺序表的种类
顺序表分为动态顺序表和静态顺序表
1静态顺序表
2,动态顺序表
上述图片就描述了动态顺序表和静态顺序表的组成。动态顺序表一定是优于静态顺序表的
在工作中如果开辟空间过大或不足造成的浪费都是很大的问题。
下面就让我们来实现动态顺序表。
三,实现动态顺序表
首先创建一个头文件叫Seqlist.h,包含一些头文件后面要用,创建动态顺序表,int size为有效数据个数, capacitry为空间容量,重命名int 为SLldatetype在后面方便替换,将struct Seqlist重命名为sl更方便。
1首先实现对顺序表的初始化
将动态数组初始为空,size和capacitry都初始为零,如果不会把arr初始为空就用malloc开辟空间。
创建结构体s1,在SLinit中传入s1的地址
在创建test.c Seqlist.c文件 在test.c中用SLtest对后续函数进行测试,在Seqlist.c进行函数的实现
2,对顺序表的销毁,在使用动态顺序表的时候会使用到动态内存管理及realloc 等函数的使用
所以必须释放空间防止内存泄漏。
声明函数
3,顺序表数据的添加,有头插和尾插两种添加方法下面来介绍尾插
声明函数
1,2,2为自己要添加的数据
在函数实现之前我们先做一个函数来判断顺序表的空间大小是否充足不够的话就对它进行realloc空间调整
然而函数是如何实现的呢
当size==capacitry的时候size所指向的下标已经越界访问数组了需要进行开辟空间,通常在开辟空间的时候一般给与原的两倍大小所以由上述代码如果capacitry为0就先给4,不是就原空间大小乘以2,用realloc函数开辟一个newcapacitry大小的空间放到ps->arr也就是结构体内的数组里;
接下来就可以方便的实现尾插
对最后一个数据也就是有效数字size,arr[size]赋值x,再进行有效数字++,就能实现尾插了;
我们该如何看到顺序表上的数据呢 ,除了调试的方法我们也可以对顺序表的数据进行打印
代码执行
尾插成功了
下面我们来实现头插
声明函数
整体思路是从下标为零开始向后移动一位在下标为零的位置填上x;
结果应该是6,5,4,1,2,2
顺序表的添加完成了,下面我们来进行顺序表的头删和尾删
4,顺序表的头删和尾删
头删的思路是从零开始一个一个覆盖,再有效长度减一;
也就是从零开始后一个覆盖到前一个数,再一直循环直到限制条件。
OK,头删完成,下面进行尾删;
一行代码足以,有效数据个数size减一就少了一个数据完成尾删;
为啥能,有效数字size也是数组下标的最后一个数,size--,也就意味着有效下标减少了,数据就没了一位。
接下来我们进行顺序表指定位置的添加
POS为下标
思路是POS之后的数整体后移,这次的覆盖方法是从后往前覆盖,如果反过来就有会全是一个数了。
接下来指定位置的删除
还是函数声明
ok,指定位置的函数删除成功
思路和指定位置的添加一直,覆盖数据,一直循环,知道限制条件。