1. 线性表的定义和概念:
线性表(List) :零个或多个数据元素的有限系列。
线性表有两个重要的特性:1)线性表中元素的个数是有限的;
2)线性表中每个元素是有序的;In another opinon, 除第一个元素无前驱节点,最后一个元素无后继节点之外,每一个元素都有且只有一个前驱节点和一个后继结点(这句话其实只是针对最基础的线性表,例如:循环链表每个元素都有前驱节点和后继节点)。
线性表的实现可以采用顺序存储的方式,也可以采用链式存储的方式。
2. 线性表之顺序存储:
1)线性表的顺序存储就是使用一块连续的内存空间进行存储。一般而言我们是使用一个固定长度的数组来实现的。抽象定义如下:
#define LIST_MAX_LENGTH XXX //线性表中可以存储的最大元素个数
typedef int ElemType; //元素类型
typedef struct {
ElemType data[LIST_MAX_LENGTH]; //定义一个固定长度的数据
int length; //记录当前线性表中元素个数
}sqList;
2)由于采用顺序存储的方式,需要实现分配固定大小的连续空间(指定LIST_MAX_LENGTH),这就需要实现确定该链表的大概长度范围,否则可能因开辟空间太小造成线性表的溢出或者开辟空间太大的浪费。
3)对顺序存储的线性表进行插入操作时:在插入元素时线性表可能已满,再行存储可能造成溢出,因此需要进行线性表已满的判断处理;在进行删除操作的时候,如果线性表为空,则根本无需进行删除操作。 对于顺序存储,如果进行插入操作,需要将后续元素进行统一后移,这个平均的时间复杂度为O(n/2), 删除操作也是同样,需要将该元素之后的所有元素进行前移,平均的时间复杂度也是O(n/2), 这就导致了顺序存储不适于频繁的插入和删除操作,而对于查询操作