从0开始学习数据结构-线性表③

159 阅读3分钟

这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

线性链表及其操作

链式存储结构

  • 为了弥补和克服顺序存储结构的不足
  • 不要求逻辑上相邻的数据元素在物理上也相邻,仅通过指针来映射数据元素之间的逻辑关系
  • 失去了顺序表的随机存取的优点

线性链表的构造

线性表的链式存储结构是用一组地址任意的存储单元(可以是连续的,也可以是不连续的)来依次存储线性表中的各个数据元素。

链结点:

  • 数据域:用以存储一个数据元素本身信息的域
  • 域名:data
  • 指针域:存储一个数据元素逻辑上的直接后继元素存储位置的域
  • 域名:link

线性表的链式存储结构:具有n个数据元素的线性表对应的n个链结点通过链接方式链接成一个链表

线性链表或者单链表:链表中每一个链结点中除了数据域以外仅设置了一个指针域

线性表A=(a1, a2, a3, ..., an-1, an)

image.png

image.png

  • 链表中的各个链结点占用的存储空间之间不要钱连续,但是每一个链结点内部占用的一系列存储单元必须连续

链结点的地址:指该链结点占用的一片连续的存储单元的第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正指向的地址未变,但在该地址处的数据此时已经无定义了。因此,系统回收的链结点空间可以再次生成链结点供需要时使用

下篇文章将会讲几个有关线性链表常用的算法