03链式存储结构的线性表——链表
# 链式存储结构的线性表——链表
## 链表
**基本概念**
1. 结点包括数据域和指针域
2. 链表是由n个结点链结成
3. 头指针——链表中第一个结点的存储位置
4. 最后一个结点的指针为空
5. 头结点——在单链表中的第一个结点请附设的一个结点

**相较于顺序表的优点**:
1. 不用定义时规定长度
2. 存储的元素个数不受限制
3. 插入和删除时,不用移动其他元素
## 单链表
**基本概念**
1. 链表的每一个结点中包含**一个**指针域
### **单链表的读取数据元素**
**获取第i个结点的数据**
- 声明一个结点指针p指向链表第一个结点a_1,初始化j从1开始
- 当j < i 时,遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1
- 如果当链表末尾p为空,则说明第i个元素不存在;否则查找成功,返回结点p的数据
**单链表的插入数据元素**
在第i个结点之后插入数据元素
- 创建一个空节点,分配内存空间,设置元素数据
- 获取第i个结点,设置新结点的后继结点为该结点的后继结点
- 设置第i个结点的后继点为新结点
提示:
1. 插入操作最后最好有插入成功或失败的返回值
2. 如果有头结点,并且记录了链表长度,则最后长度也要加1
3. 有头结点的单链表插入操作才能统一
**单链表删除数据元素**
删除第i个结点及其数据元素
- 获取第i个结点,如果该结点不是第一个结点,则获取第i-1个结点
- 将第i-1个结点的后缀结点设为第i个结点的后缀结点
- 删除第i个结点,释放内存空间,记录并返回删除的数据元素的值
- 最后 整体-1
**删除单链表整张表**
销毁单链表,释放内存空间
- 声明结点p和q
- 将第一个结点赋值给p
- 循环将下一个结点赋值给q,释放p,将q赋值给p
void clearList(LinkList L){
LinkList p,q;
p = (L)->next;//p为第一个结点
while(p){
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
}
**单链表VS顺序表**

由于搬运的时间成本,更多笔记分享请转至https://blog.csdn.net/weixin_42248871

浙公网安备 33010602011771号