线性表的链式表示和实现讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
思路:要存取第i个数据元素,必须从头指针起一直找到 该结点的指针p,然后才能执行 p->data=new_value 。
访问第i个数据元素的操作函数可写为:
Status GetElem_L(LinkList L, int i, ElemType e) {p=L->next; j=1; //带头结点的链表
Q1:第一行的LNode 与最后一行的LNode是不是一回 事?
A1:不是。前者LNode是结构名,后者LNode是对整个 struct类型的一种“缩写”,是一种“新定义名”,它只 是对现有类型名的补充,而不是取代。
10
Q2: 那为何两处要同名(LNode和LNode)?太不严谨 了吧?
A2:同名是为了表述起来方便。因为描述的对象相同, 方便阅读和理解。 Q3:结构体中间的那个struct LNode是何意?
(1) 链式存储结构特点: 其结点在存储器中的位置是随意的,即逻辑上 相邻的数据元素在物理上不一定相邻。
如何实现? 通过指针来实现!
让每个存储结点都包含两部分:数据域和指针域
样式: 数据 指针 或 指针 数据 指针
数据域:存储 元素数值数据
指针域:存储直接后继或 者直接前驱的存储位置
设计思想:牺牲空间效率换取时间效率 3
13
(2) 单链表的插入(重点)
在链表中第i个位置前插入一个元素x 的示意图如下:
p
p
ai-1
ai
ai-1
ai
p->next
插入X
第2章 线性表
2.1 线性表的逻辑结构 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示和相加
1
2.3 线性表的链式表示和实现
2.3.1 链表的表示 2.3.2 链表的实现 2.3.3 一个带头结点的单链表类型 2.3.4 其它形式的链表
2
2.3.1 链表的表示
答:因每个结点至少有两个分量,且数据类型通常不 一致,所以要采用结构数据类型。
设每个结点用变量node表示,
p
data *next
其指针用p表示,两个分量分
node
别用data和*next表示,这两
个分量如何赋值?
方式1: 直接表示为 node.data='a';node.next=q; 方式2:p指向结点首地址 p->data='a'; p->next=q; 方式3:p指向结点首地址 (*p).data='a'; (*p).next=q;
while(p&&j<i) {p=p->next; ++j;}
if ( !p || j>i ) return ERROR; //i不合法
p->data =e;
//若是读取则为:e=p->data;
return OK;}// GetElem_L
缺点:想寻找单链表中第i个元素,只能从头指针开始逐一查来自(顺藤摸瓜),无法随机存取 。
头指针是指向链表中第一个结点(或为头结点、或为
首元结点)的指针;
5
讨论1: 如何表示空表?
无头结点时,当头指针的值为空时表示空表;
有头结点时,当头结点的指针域为空时表示空表。
头指针 ^
头指针 头结点 ^
头结点不计入 链表长度!
无头结点
有头结点
讨论2: 在链表中设置头结点有什么好处?
因为任何结点都有前驱结点,而在做插入和删除操
其中指针X,Y,Z的值分别为多少?该线性表的首 结点起始地址为多少?末结点的起始地址为多少?
05 U 17 X 23 V 31 Y 47 Z
100 104
108
112
116
119
答:X= 116
Y= NULL(0) Z=
首址= 108
末址=
100 , 112 。
8
讨论: 链表的数据元素有两个域,不再是简单数据 类型,编程时该如何表示?
表的链式存储映像,称为线性表的链式存储结构。
只包含一个指针域的称为单链表或线性链表
4
3)头指针、头结点和首元结点的区别
示意图如下:
head
info
a1
a2

an ^
头指针 头结点 首元结点
首元结点是指链表中存储线性表第一个数据元素a1的 结点。
头结点是在链表的首元结点之前附设的一个结点;数 据域内只放空表标志和表长等信息,它不计入 表长度。
的值是多少?
存储地址 数据域
1
LI
7
QIAN
13
SUN
指针域 43 13 1
答:头指针是指向链表 中第一个结点的指针, 因此关键是要寻找第一 个结点的地址。
19
WANG NULL
25
WU
37
H 31 ZHAO 7
31
ZHAO
7
37
ZHENG
19
43
ZHOU
25
称:头指针H的值是31 7
例2现:有一个具有五个元素的线性表L={23,17,47, 05,31},若它以链接方式存储在下列100~119号 地址空间中,每个结点由数据(占2个字节)和指针 (占2个字节)组成,如下图所示。
作时,都需修改其前驱结点的指针域,因此对首元结点
可以统一处理。即简化插入和删除操作;
表头指针是指向头结点的非空指针,因此空表和非
空表的处理一样。
6
(3)举例 例1:一个线性表的逻辑结构为:
(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WAN
G),其存储结构用单链表表示如下,请问其头指针
链表存放示意图如下:
head
a1
a2
……
an /\
讨论1:每个存储结点都包含两部分:数据域和 指针域 讨论2:在单链表中,除了首元结点外,任一结点的 存储位置由 其直接前驱结点的链域的值 指示。
(2) 与链式存储有关的术语:
1)结点:数据元素的存储映像。由数据域和指针域两 部分组成;
2)链表: n 个结点由指针链组成一个链表。它是线性
A3:在“缩写” LNode还没出现之前,只能用原始 的struct LNode来进行变量说明。此处说明了指针分 量的数据类型是struct LNode。
返 回 11
2.3.2 链表的实现
(1) 单链表的存取 (2) 单链表的插入 (3) 单链表的删除 (4) 单链表的建立
12
(1) 单链表的存取
9
单链表的抽象数据类型描述如下(参见教材P28):
typedef struct LNode { ElemType data; //数据域 struct LNode *next; //指针域
}LNode, *LinkList; // *LinkList为Lnode类型的指针 这就是我们在复习c语言时讲的自引用结构
相关文档
最新文档