首页 理论教育C语言程序设计基础:单链表基本操作示例

C语言程序设计基础:单链表基本操作示例

【摘要】:单链表是一种链式存储结构,是处理线性表的常用的数据表示形式。为了确定单链表第一个结点的存放位置,使用一个指针变量指向链表的表头,这个指针变量称作“头指针”。下面程序段描述的是用第一种方法构造单链表。带头结点单链表基本操作示例。要求设计一个简单的菜单,根据对菜单项的选择分别实现带头结点单链表的构造操作、插入操作、删除操作和输出操作。

线性表是常见的一种数据逻辑结构,线性表各数据元素之间的逻辑结构可以用一个简单的线性结构表示出来,其特征是:除第一个和最后一个元素外,任何一个元素都只有一个直接前驱和一个直接后继;第一个元素无前趋而只有一个直接后继;最后一个元素无后继而只有一个直接前趋。单链表是一种链式存储结构,是处理线性表的常用的数据表示形式。

1.单链表使用的数据结构

10.4 结点结构

单链表的数据元素称为结点。单链表的每个结点由两部分组成:一个是用于存储实际数据的存储区,称为数据域;另一个是用于提供链表的链接作用的指针,称为指针域。其结点结构如图10.4所示。

在单链表的构造中,除第一个结点之外,其余每一个结点的存放位置由该结点的前驱在其指针域中指出。为了确定单链表第一个结点的存放位置,使用一个指针变量指向链表的表头,这个指针变量称作“头指针”。单链表的最后一个结点没有后继,为了表示这个概念,该结点的指针域赋值为空(NULL或∧)。单链表的一般结构如图10.5所示。

图10.5 单链表的存储结构

常用的结点结构C语言描述方式如下:

其中:elementtype是某种用于表示结点数据域的数据类型,可以是基本数据类型或者是结构体之类的构造数据类型;NODE是结点类型struct node的别名。

【例10.11】 下面示例中的数据类型NODE定义如下:

/*功能:构造示例程序使用的数据结构,存入头文件ex1011.h*/

设计单链表基本运算实现程序需要使用存储分配和释放标准库函数,常用的是存储分配函数malloc和存储释放函数free,这两个标准库函数的使用方法在6.5.1小节中已经讨论过,请读者自行参考。

2.单链表的构造

单链表的构造方法有两种:一种是将新结点添加到链表的头部,一种是将新结点添加到链表的尾部。下面程序段描述的是用第一种方法构造单链表。

在函数中首先创建单链表的头结点,构成一个空的单链表。然后根据所需要创建的链表长度,反复地依次为每一个结点分配存储空间、输入结点的数据、将新建的结点插入到单链表的头结点之后。

3.单链表的输出

单链表的输出实质上就是对某一头指针指向的单链表进行遍历,也就是将单链表中的每一个数据元素结点从表头开始依次处理一遍。下面程序段描述了单链表输出的基本概念。

4.单链表上的插入运算

如果将一个新的结点插入链表中间的某个位置,其操作只需要如图10.6所示修改两个结点的指针域即可。

图10.6 在单链表中插入新结点

(1)p->next=q->next(2)q->next=p

实现在单链表上插入一个结点的基本过程如下:

①创建一个新结点;

②按要求寻找插入点;

③被插入结点的指针域指向插入点结点的后继结点;

④插入点结点的指针域指向被插入的结点。

下面的程序段描述带头结点的单链表中实现的插入结点运算。

在函数中首先创建被插入的新结点,然后通过对结点某一数据域(本例中为name)进行比较,确定新结点的插入位置,最后将新建结点插入链表中。

5.单链表上的删除运算

在单链表中删除一个结点的实质就是将该结点从链表中移出,使得被删除结点的原后继结点成为被删除结点原前趋结点的直接后继,如图10.7所示。(www.chuimin.cn)

图10.7 在单链表中删除结点

(1)q->next=p->next(2)free(p);

删除结点被从链表中移出后,仍然占据存储单元,必须使用存储释放函数将其所占据的存储单元释放归还系统。

实现在单链表中删除一个数据元素结点的基本过程如下:

①查找被删除结点以及其前趋结点;

②被删除结点的前趋结点指针域指向被删除结点的直接后继结点;

③释放被删除结点。

下面程序段描述带头结点的单链表中实现的删除结点运算。

/*Name:ex101104.c

在函数中首先按某种条件定位被删除结点和它的前趋结点,然后将被删除结点从链表中取出并释放其所占的存储空间。

6.单链表操作综合示例

上面分别讨论了单链表的最基本运算,可以将这些函数组织起来形成一个能够对单链表进行简单处理的程序,下面的示例展示了组织方法,请读者结合前面对单链表各种基本运算的介绍自行分析。

【例10.12】 带头结点单链表基本操作示例。要求设计一个简单的菜单,根据对菜单项的选择分别实现带头结点单链表的构造操作、插入操作、删除操作和输出操作。