1. 概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,类似于数组,所以一般采用数组来实现存储。
2. 分类
顺序表可分为两种:
一、静态顺序表:使用定长的数组存储数据
二、动态顺序表:动态开辟内存的数组存储数据
第一种分析:
第二种分析:
3. 接口实现
3.1 初始化顺序表
首先先创建一个顺序表
注意传参的是时候要传入SL的地址,因为要对他本身进行初始化,函数的传参 参数是一份临时拷贝,不取地址的话当函数结束时,SL本身也不会又任何修改。
在初始化过程中我们需要做的是给数组开辟一个初始化空间,为了便于后期更改这个空间,可以用define关键字来定义这个数,并且还需要更改capacity和size的值
3.2 插入数据
顺序表对数据的插入分为尾插和头插
注意:在每个元素插入之前我们还需要实现一个检查空间是否已满从而分析需不需要扩容的操作。
当空间已满的时候我们对内存的扩容是原来空间2倍的增加,这里可以根据个人需求进行更改。
下面是尾插的代码:
尾插还是比较简单,只需通过下标找到要插入的位置即可。
下面是头插的代码:
这段代码相对尾插来说就显得复杂一点,但我们可以通过画图分析
很明显可以看到头插需要将所有数据往后移动一次,显然当数据足够多时,这对时间的开销是很大 的。
3.2 删除数据
顺序表删除数据也分为尾删和头删
注意:删除数据时我们需要检查当前数据是否为空,如果已经没有数据了则不能进行删除。
下面是尾删代码:
尾删操作更加简单,因为对于顺序表的数据的操作我们都是控制的size,所有只需要改变size指向的位置就可以实现数据的 “删除”,并不需要真正的删除那个元素,因为我们无法对数组的单个空间进行删除。
下面是头删的代码:
通过画图分析可知,头删和头插类似,需要移动全部的数据,将后面的每一个数向前移动覆盖前面的数据实现删除的效果,这个时间开销也是很大的。
3.3 查找数据
代码实现:
顺序表查找数据很简单,只需依次遍历每一个元素相比较,如果存在则返回下标,不存在则返回-1。
3. 4 其他操作
剩下的操作包括顺序表的销毁,打印,在指定位置删除,插入数据。
对于在pos位置删除或插入某个数据的方法和头删和头插类似,可以结合上面图来分析。