1.什么是线性表?
线性表可以看作一条链子除了第一个元素和最后一个元素,其他每个元素都有一个前驱
元素和一个后继元素有且只有一个。
若一个元素都没有,则称为空表。
元素之间的关系是一一对应的关系。(就比如a2的前驱元素只有一个并且一定是a1,a2的后继元素也只有一个并且一定是a3)
2.线性表的顺序存储结构:
指用一段连续地址的存储单元依次存储线性表的数据元素。(就是用数组来存储线性表的数据元素)
定义一个顺序存储结构的线性表
typedef struct
{
type data[max]; //需要定义数组长度
int length; //线性表的当前长度,就是当前
// 线性表有几个元素
}
还要知道起始的位置,就是data的首地址
因为数组是从下标0开始计起的,所以线性表的第 i 个元素存储在数组的下标为 i-1 的位置
由于每个元素都有自己对应的下标位置且数组的第一个位置也是知道的,所以存入和读取数据的时间复杂度为O(1)。例如:把100存入第i个数据或读取第i个数据,只需找下标为 i-1 的元素进行存入或读取操作就行了,相当于执行了一次,所以算法复杂度为O(1)。
3.顺序存储结构的插入和删除
想一下在饭堂排队的情况,如果这时候有人插队,那么这个人后面的所有人都要向后移动一位。如果有个人看到另一队人少,就去排另一队了,那么这个人后面的所有人都向前移动一位。
顺序存储结构的插入和删除也是一样:
插入元素:
1.判断:如果元素插入的位置不合理或者线性表长度大于数组长度则抛出异常。 O(1)
2.移动:从最后一个元素遍历到第i个元素的位置,把它们分别向后移动一位。O(n)
3.插入元素:把新元素插入位置 i 。 O(1)
4.线性表长度+1。
删除元素:
1.判断:如果元素删除的位置不合理则抛出异常。 O(1)
2.删除元素:把位置 i 的元素取出,赋给*e。 O(1)
3.移动:从第 i+1 个元素遍历到最后一个元素,把它们分别向前移动一位。O(n)
4.线性表长度 -1。
由上面可以看出顺序存储结构在存入、读取数据时的时间复杂度为O(1),而插入或删除元素时的时间复杂度为O(n)。说明它比较适合元素个数不太变化,而更多是存储数据的应用。