03链式存储结构的线性表——链表

#  链式存储结构的线性表——链表

## 链表

**基本概念**

1. 结点包括数据域和指针域

2. 链表是由n个结点链结成

3. 头指针——链表中第一个结点的存储位置

4. 最后一个结点的指针为空

5. 头结点——在单链表中的第一个结点请附设的一个结点

   ![img](https://img-blog.csdnimg.cn/20200615232828431.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjI0ODg3MQ==,size_16,color_FFFFFF,t_70)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)





**相较于顺序表的优点**:

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顺序表**

![img](https://img-blog.csdnimg.cn/20200615232852315.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjI0ODg3MQ==,size_16,color_FFFFFF,t_70)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
posted @ 2022-01-03 21:32  小白学安全  阅读(176)  评论(0)    收藏  举报