线性表的链式存储
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1.1 单链表
在链式存储中,逻辑上相邻的数据元素在物理存储位置 不一定也相邻。那么,怎么表示两个数据元素逻辑上的相邻 关系呢?可以这样解决,把原来的数据元素结点存储信息进 行扩展,每个存储结点不仅存储数据元素本身的信息,而且 需要存储数据元素之间逻辑关系的信息。
3.1.1 单链表
0
1
2
3
ABCD
1.带头结点的单链表 2.不带头结点的单链表
3.3.3 单链表插入操作的实现
单链表的插入操作是指在表的第i个位置结点处插入一 个值为data的新结点。插入操作需要从单链表的第一个结点 开始遍历,直到找到第i个位置的结点。插入操作分为在结 点之前插入的前插操作和在结点之后插入的后插操作。
1.前插操作 2.后插操作
3.3.1 单链表辅助运算的实现
单链表辅助运算主要是指在对单链表进行插入、删除和 查找等操作时的执行条件或准备工作的检查和判断。具体分 为链表初始化、判表空、清空三个操作。
1.初始化链表L 2.清空链表L 3.判链表L是否为空
3.3.2 单链表求表长的实现
求单链表的长度与顺序表不同,顺序表可以通过保存表 的实际长度length的值直接求得;而单链表需要从第一个结 点开始,一个一个结点进行遍历,直到表的末尾。下面对单 链表是否带头结点分别介绍实现算法。
3.3.3 单链表插入操作的实现
q
p
ai-2
ai-1
ai
s
x百度文库
(a) 插入前
q
p
ai-2
ai-1
ai
s
x
(b) 插入后
p
ai-1
ai
ai+1
s
x
(a) 插入前
p
ai-1
ai
ai+1
s
x
(b) 插入后
3.3.4 单链表删除操作的实现
单链表的删除操作是指删除第i个结点。通过改变待删 除结点的前驱结点指针,让它直接指向待删除结点的后继就 可以实现删除操作。删除操作和插入操作相同的是需要从开 始结点进行遍历,直到找到第i个位置的结点。如果删除的 是第一个结点,情况有所不同,需要把该结点的直接后继结 点的地址赋给头指针。对于其它结点,需要保存被遍历到的 结点的直接前驱,找到第i个结点后,把该结点的直接后继 作为它的直接前驱的直接后继。
存储地址 数据域
108
C
指针域
136
首元素位置
100
A
110
……… ……… ………
136
D NULL
110
B
108
3.1.2 循环链表
循环链表就是将单链表中的最后一个结点的next指针指 向链表中第一个结点。链的表头和表尾相接,使整个链表构 成一个环形。这样做的好处是对表的链接方式改变后,无须 增加存储量,即可使得表处理更加方便灵活。
2.整数型单链表算法
3.不带头结点的单链表算法
3.2.2 尾插法单链表的创建实现
用头插法实现单链表的创建,比较简单,但读入的数据 元素的顺序与生成的链表中元素的顺序是相反的。若希望两 者次序一致,则用尾插法创建单链表。为了快速找到新结点 插入到链表的尾部位置,所以需加入一个尾指针r用来始终 指向链表中的尾结点。初始状态:头指针L和尾指针r均为空 ,把各数据元素按顺序依次读入,申请结点,将新结点插入 到r所指结点的后面,然后r指向新结点,直到读入结束标志 为止。
3.1 线性表的链式存储结构
线性表的顺序表示的特点是用物理位置上的邻接关系来 表示结点间的逻辑关系,这使得可以随机存取表中的任一结 点,但也使得插入和删除操作会移动大量的数据元素,而且 线性表的容量难以扩充。下面介绍的链式存储结构具有很多 优点,它可以避免插入和删除操作带来的大量结点的移动, 能给结点动态分配存储空间等优点。下面介绍几种常用的链 表。
L
(a) 空循环链表
L
a1
a2
...
an
(b) 非空循环链表
3.1.3 双向链表
在单链表结点中只有一个指向其后继结点的next指 针域,而找其前驱则只能从该链表的头指针开始,顺着各 结点的next指针域进行查找,也就是说找后继的时间复 杂度是O(1),找前驱的时间复杂度是O(n)。如果也希望 找前驱像后继那样快,则只能付出空间的代价:每个结点 再加一个指向前驱的指针域prior,结点的结构修改为下 图,这样链表中有两个方向不同的链,用这种结点组成的 链表称为双向链表。
3.2.2 尾插法单链表的创建实现
L
插入P前的尾指针 插入P后的尾指针
r
3
4
P1
x^
2
3.3 单链表运算的实现
单链表建立之后,如果要进行一些如查找、插入、删除等 操作该如何实现?所以还须掌握一些单链表的各种算法,来实 现这些操作。单链表的运算和顺序表类似,比较多。它的运算 包括链表初始化、判表空、清空辅助运算和求表长、查找、插 入和删除基本运算。下面分别介绍各运算的算法的实现过程。
3.2.1 头插法单链表的创建实现
用头插法实现单链表的创建是从一个空表开始重复读 入数据,每读入一个数据元素则申请一个结点,将读入数据 存放到新结点的数据域中,然后将新结点插入到当前链表的 表头上,直到读入结束标志为止。因为是在链表的头部插入 ,读入数据的顺序和链表中的逻辑顺序是相反的。
1.字符型单链表算法
3.1.4 静态链表
头结点位置
SL=0
AV=6
data next
0
4
1
a4
5
2
a2
3
3
a3
1
4
a1
2
5
a5
-1
6
7
7
8
8
9
9
10
10
11
11
-1
3.2 单链表创建算法的实现
单链表的建立与顺序表的建立不同,它是一种动态管理 的存储结构,链表中的每个结点占用的存储空间不是预先分 配,而是运行时系统根据需求而动态生成的。单链表的建立 分为在头部插入结点建立单链表和在尾部插入结点建立单链 表(分别简称为头插法和尾插法)。下面分别介绍两种创建 算法的实现过程。
指针域 数据域 指针域
prior data next
3.1.3 双向链表
L L
prior data next
^
^
(a) 空双向循环链表
a1
... ...
an
(b) 非空双向循环链表
3.1.4 静态链表
静态链表就是用一维数组来描述线性链表,结点中使用 游标(即数组下标)指示直接后继结点在数组中的相对位置 。这种描述方法便于在没有指针类型的高级程序设计语言( 如FORTRAN)中使用链表结构。这种存储结构,虽然仍需 要预先分配一个较大的空间,但在做线性表的插入和删除操 作时不需移动元素,仅需修改指针,故仍具有链式存储结构 的主要优点。