1.线性表的定义
线性表是具有相同特性元素的一个有限序列。
所含元素个数=线性表长度。
2.线性表的逻辑特性
只有一个表头元素,一个表尾元素,表头元素没有前驱,表尾元素没有后继,其他元素只有一个直接前驱,一个直接后继。
3.线性表的存储结构
(1)顺序存储结构(顺序表)
- 随机访问特性
- 需占用连续的存储空间
- 做插入操作时要移动多个元素
(2)链式存储结构(链表)
- 不支持随机访问
- 结点的存储空间利用率较顺序表稍低一些(每个结点需划出一部分空间来存储指向下一个结点位置的指针)
- 支持存储空间的动态分配
- 插入操作无需移动元素
链表的五种形式:
1)单链表
①带头结点的单链表:头结点不存储信息(仅存储一些描述链表属性的信息,如表长),只是作为标志。头指针head指向头结点,始终不等于NULL,head->next等于NULL时,链表为空。
②不带头结点的单链表:所有结点都存储信息。头指针head指向开始结点,当head等于NULL时,链表为空。
结点定义:
typedef struct LNode
{
int data; //data中存放结点数据域
struct LNode *next; //指向后继结点的指针
}LNode; //定义单链表结点类型
2)双链表
双链表能够由终端结点反向走到开始结点。就是在单链表结点上添加了一个指针域,指向当前结点的前驱。
结点定义:
typedef struct DLNode
{
int data; //data中存放结点数据域
struct DLNode *prior; //指向前驱结点的指针
struct DLNode *next; //指向后继结点的指针
}DLNode;
3)循环单链表
将单链表的最后一个指针域(空指针)指向链表的第一个结点。
4)循环双链表
将双链表终端结点的next指针指向链表中的第一个结点,将链表中第一个结点的prior指针指向终端结点。
以下四句中任意一句为真,即可判断循环双链表为空
head->next==head;
head->prior==head;
head->next==head && head->prior==head;
head->next==head || head->prior==head;
5)静态链表
一般链表结点空间来自于整个内存,静态链表则来自于一个结构体数组。