线性表基本概念与实现
1.线性表的定义:线性表是具有相同特性数据元素的一个有限序列
2.线性表的逻辑特性:只有一个表头元素,只有一个表尾元素,表头元素没有前驱,表尾元素没有后继,除表头和表尾元素之外,其他元素只有一个直接前驱,也只有一个直接后继。
3.线性表的存储结构:顺序存储结构(顺序表)、链式存储结构(链表)
(1)顺序表
定义:把线性表中的所有元素按照其逻辑顺序,依次存储到从指定的存储位置开始的一块连续的存储中间内。
特性:随机访问特性、占用连续的存储空间、作插入操作需要移动多个元素
注:随机访问特性即可以随意访问任意的元素。存储分配只能预先进行,一旦分配好了1,在对其操作的过程中始终不变。
(2)链表
定义:每个结点不仅包含所存元素的信息,还包含元素之间逻辑关系的信息。
特性:不支持随机访问,结点的存储空间利用率较顺序表稍微低一些、链表支持存储空间的动态分配、链表插入无需移动元素
4. 链表的形式:单链表、双链表、循环单链表、循环双链表、静态链表
(1)单链表
在每个结点中除了包含数据域外,还包含一个指针域,用以指向其后继结点。
判空方式:带头结点的单链表:head->next == NULL
不带头结点的单链表:head == NULL
(2)双链表
双链表就是在单链表结点上增添一个指针域,指向当前结点的前驱。(这样就可以方便的由其后继来找到前驱,从而实现输出终端结点到开始结点的数据序列)
判空方式:带头结点的双链表:head->next ==NULL
不带头结点的双链表:head==NULL
(3)循环单链表
将单链表的最后一个指针域(空指针)指向链表的第一个结点
判空方式:带头结点的循环单链表:head == head-next
不带头结点的循环单链表: head ==NULL
(4)循环双链表
将中端结点的next指针指向链表中的第一个结点,将链表中的第一个结点的prior指针指向终端结点
判空方式:不带头结点的循环双链表: head == NULL
带头结点的循环双链表:head->next == head
或者: head->prior == head
或者: head->next == head && head ->prior == head
或者: head->next == head || head -> prior == head
(5)静态链表
静态链表借助一维数组来实现
注:带头结点,头指针head指向头结点,头结点的值域不含任何信息(仅存储一些描述链表属性的信息,如表长)。不带头结点的单链表中的头指针head指向开始结点。
顺序表和链表比较:
(1)基于空间的比较
1)存储分配方式:
顺序表的存储空间是一次性分配的,链表的存储空间是多次分配的。
2)存储密度
顺序表的存储密度=1;链表的存储密度<1(因为结点有指针域)
(2)基于时间的比较
1)存取方式
顺序表可以随机存取,也可以顺序存取(一般只答顺序存取)
链表只能顺序存取
2)插入/删除时移动元素的个数:
顺序表平均移动一半的元素;链表不需要移动元素,只需要修改指针。