1 链表基本概念
1.1 什么是链表
- 链表是一种常用的数据结构,它通过指针将一些列数据结点,连接成一个数据链。相对于数组,链表具有更好的动态性(非顺序存储)。
- 数据域用来存储数据,指针域用于建立与下一个结点的联系。
- 建立链表时无需预先知道数据总量的,可以随机的分配空间,可以高效的在链表中的任意位置实时插入或删除数据。
- 链表的开销,主要是访问顺序性和组织链的空间损失。
数组和链表的区别:
1.2 有关结构体的自身引用
问题1:请问结构体可以嵌套本类型的结构体变量吗?
问题2:请问结构体可以嵌套本类型的结构体指针变量吗?
- 结构体可以嵌套另外一个结构体的任何类型变量;
- 结构体嵌套本结构体普通变量(不可以)。本结构体的类型大小无法确定,类型本质:固定大小内存块别名;
- 结构体嵌套本结构体指针变量(可以), 指针变量的空间能确定,32位, 4字节, 64位, 8字节;
1.3 链表节点
大家思考一下,我们说链表是由一系列的节点组成,那么如何表示一个包含了数据域和指针域的节点呢?
链表的节点类型实际上是结构体变量,此结构体包含数据域和指针域:
- 数据域用来存储数据;
- 指针域用于建立与下一个结点的联系,当此节点为尾节点时,指针域的值为NULL;
1.4 链表的分类
链表分为:静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式:
- 所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。
- 所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。
1.4.1 静态链表
1.4.2 动态链表
1.4.3 带头和不带头链表
- 带头链表:固定一个节点作为头结点(数据域不保存有效数据),起一个标志位的作用,以后不管链表节点如果改变,此头结点固定不变。
- 不带头链表:头结点不固定,根据实际需要变换头结点(如在原来头结点前插入新节点,然后,新节点重新作为链表的头结点)。
1.4.4 单向链表、双向链表、循环链表
单向链表:
双向链表:
循环链表:
2 链表基本操作
2.1 创建链表
使用结构体定义节点类型:
编写函数:link_node* init_linklist()
建立带有头结点的单向链表,循环创建结点,结点数据域中的数值从键盘输入,以 -1 作为输入结束标志,链表的头结点地址由函数值返回.
2.2 遍历链表
顺序输出单向链表各项结点数据域中的内容:
2.3 插入节点
在指定值后面插入数据data,如果值val不存在,则在尾部插入。
2.4 删除节点
删除第一个值为val的结点.
2.5 销毁链表
销毁链表,释放所有节点的空间.