这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战
线性链表及其操作
链式存储结构
- 为了弥补和克服顺序存储结构的不足
- 不要求逻辑上相邻的数据元素在物理上也相邻,仅通过指针来映射数据元素之间的逻辑关系
- 失去了顺序表的随机存取的优点
线性链表的构造
线性表的链式存储结构是用一组地址任意的存储单元(可以是连续的,也可以是不连续的)来依次存储线性表中的各个数据元素。
链结点:
- 数据域:用以存储一个数据元素本身信息的域
- 域名:data
- 指针域:存储一个数据元素逻辑上的直接后继元素存储位置的域
- 域名:link
线性表的链式存储结构:具有n个数据元素的线性表对应的n个链结点通过链接方式链接成一个链表
线性链表或者单链表:链表中每一个链结点中除了数据域以外仅设置了一个指针域
线性表A=(a1, a2, a3, ..., an-1, an)
- 链表中的各个链结点占用的存储空间之间不要钱连续,但是每一个链结点内部占用的一系列存储单元必须连续
链结点的地址:指该链结点占用的一片连续的存储单元的第1个单元的地址
用C语言描述链结点的类型:
typedef struct node {
ElemType data;
struct node * link;
} LNode, *LinkList; // 定义一个线性链表类型
/*
* 产生链结点的途径
* 1. 调用系统中已有的动态存储分配过程或者函数,如C语言的malloc函数,由系统动态分配链结点的空间 => 动态链表(※)
* 2. 利用程序中已经声明的数组的数组元素产生链结点 => 静态链表
*/
若指针变量p为指向线性表中某个链结点的指针
- p->data: 若出现在表达式中表示p所指的链结点的数据域信息(内容),否则,表示由p所指的那个链结点的数据域(位置)
- p->link: 若出现在表达式中,表示p所指的链结点的指针域信息(指针域的内容),也就是p所指的链结点的下一个链结点的存储地址;否则表示由p所指的那个链结点的指针域(位置)
线性链表的基本算法
p = (LinkList)malloc(sizeof(LNode)); // 由系统生成一个LinkList类型的链结点,同时将该链结点的地址赋值给指针变量p。需添加 #include <alloc.h>
free(p); // 执行结果是:p正指向的地址未变,但在该地址处的数据此时已经无定义了。因此,系统回收的链结点空间可以再次生成链结点供需要时使用
下篇文章将会讲几个有关线性链表常用的算法