n个结点由指针链组成一个链表。链表的结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
链表的每一个结点有两个区域,分别是数据域和指针域。数据域存储的是当前结点的数据值,而指针域存储的是下一个结点的存储地址。
![](https://img-blog.csdnimg.cn/img_convert/50c48ae32feb51308737e8ffbf97e722.png)
![](https://img-blog.csdnimg.cn/img_convert/548888557a7e6b45d7695757b71e4ab9.png)
单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名。
![](https://img-blog.csdnimg.cn/img_convert/5708774039eac16c9bcba8c64d5d269d.png)
头指针、头结点、首元结点
![](https://img-blog.csdnimg.cn/img_convert/bd05869830f22de378be15e6c3690317.png)
H表示头指针
![](https://img-blog.csdnimg.cn/img_convert/fb8551f42b15e36665eb84175ca1c826.png)
如何表示空表
无头结点时,头指针为空时表示空表。有头结点时,当头结点的指针域为空时表示空表。
头结点的数据域内装的是什么?
头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。
链表的特点
访问时只能通过头指针进入链表,并通过每个结点的指针域依次向后顺序扫描其余结点,所以寻找第一个结点和最后一个结点所花费的时间不等。链表是顺序存取,顺序表是随机存取。
单链表的定义和表示
![](https://img-blog.csdnimg.cn/img_convert/1c83334fb916e17f42bbb82f6754026b.png)
![](https://img-blog.csdnimg.cn/img_convert/a9e8995f88dadc172c3e129808834c01.png)
例如,存储学生学号、姓名、成绩的单链表结点类型定义如下:
方式一:
![](https://img-blog.csdnimg.cn/img_convert/b4b914f809a3d85c4631f8a34634c54e.png)
方式二:
![](https://img-blog.csdnimg.cn/img_convert/dd2c5ce8ffb2befafed1b38d6d9a0e86.png)
构造一个空表
![](https://img-blog.csdnimg.cn/img_convert/768dcec8d725e0626b956a58162dfd71.png)
![](https://img-blog.csdnimg.cn/img_convert/8725a7815556beb156d5cafa1f58b30d.png)
#define OK 1
typedef int Status;
判断链表是否为空
![](https://img-blog.csdnimg.cn/img_convert/b3db0b1be68c656a29abeb64f23fc629.png)