第十一章 链表
1
结构的概念与应用
例:跳马。依下图将每一步跳马之后的位置(x,y)放
到一个“结点”里,再用“链子穿起来”,形成
一条链,相邻两结点间用一个指针将两者连到一
起。
2
依上图有7个结点
(x1,y1)
(x2,y2)
(x6,y6)
(x7,y7)
为了表示这种既有数据又有指针的情况,
引入结构这种数据类型。
3
11.7 用指针处理链表
链表是程序设计中一种重要的动态数据结构,它是动态地进行存储
分配的一种结构。
动态性体现为:
n链表中的元素个数可以根据需要增加和减少,不
像数组,在声明之后就固定不变;
n元素的位置可以变化,即可以从某个位置删除,
然后再插入到一个新的地方;
4
结点里的指针是存放下一个结点的地址
Head 1249 1356 1475 1021
1249
A
1356
B
1475
C
1021
D
Null
1、链表中的元素称为“结点”,每个结点包括两
个域:数据域和指针域;
2、单向链表通常由一个头指针(head),用于指向
链表头;
3、单向链表有一个尾结点,该结点的指针部分指
向一个空结点(NULL) 。
5
链表中结点的定义
q链表是由结点构成的, 关键是定义结点;
q链表的结点定义打破了先定义再使用的限制,
即可以用自己定义自己;
q递归函数的定义也违反了先定义再使用;
这是C语言程序设计上的两大特例
6
链表的基本操作
对链表的基本操作有:
(1)创建链表是指,从无到有地建立起一个链表,即往空链表中
依次插入若干结点,并保持结点之间的前驱和后继关系。
(2)检索操作是指,按给定的结点索引号或检索条件,查找某个
结点。如果找到指定的结点,则称为检索成功;否则,称为检索失
败。
(3)插入操作是指,在结点ki-1与ki之间插入一个新的结点k’,使线
性表的长度增1,且ki-1与ki的逻辑关系发生如下变化:
插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,新插入的结点k’成
为ki-1的后继、ki的前驱.
7
(4)删除操作是指,删除结点ki,使线性表的长度减1,且ki-1、ki和ki+1之
间的逻辑关系发生如下变化:
删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1成为ki+1的前驱,ki+1成为
ki-1的后继.
(5)打印输出
8