链表及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

14
【例】 如图所示的静态链表。该链表存储在一个数组空间 中,该数组为结构类型,每一个数组元素包括两个分量(也 可以是多个分量):存放表中元素值的data分量和存放该元 素直接后继位置的next分量。
15
我们可以用结构体来定义静态链表的节点数据类型: typedef struct{ Datatype data; int next; }node; 一个静态链表可以描述为: #define maxsize 100 node nodepool[maxsize];//存放链表的数组 int head; //放头指针的head 在静态链表中进行插入与删除操作不需要移动元素, 只需改变被插入(删除)元素的直接前驱的next域中的 值。
ai的唯一直接后继;而a1无前驱,an无后继 ☞ 链表属于线性逻辑结构。
6
3.1 链表的基本概念
3.1.1 什么是链表 3.1.2 链表的逻辑结构 ☞ 3.1.3 链表的存储结构 3.1.4 静态链表和动态链表 3.1.5 链表的基本运算
7
♣ 链表的存储结构
☞ 用一组任意的存储单元来存放表中的元素,这使 得链表中数据元素的逻辑顺序与其物理存储顺序不一定 相同;
16
☞ 动态链表
由于静态链表需要事先估计表中数据元素的个数,
通常情况下,我们可以为链表中的每一个数据元素分配
相应的存储空间. 该存储空间中存放有该数据元素的值(data域)和其 直接后继的存储空间地址(next域),数据元素之间的逻
辑关系由每一个这样的存储空间中所存储的地址来维系。
我们称这样的链表为动态链表。
4
3.1 链表的基本概念
3.1.1 什么是链表 ☞ 3.1.2 链表的逻辑结构 3.1.3 链表的存储结构 3.1.4 静态链表和动态链表 3.1.5 链表的基本运算
5
♣ 链表的逻辑结构
☞ 同一链表中所有数据元素的数据类型必须相同。 ☞ 链表中相邻的元素ai-1、ai间存在序偶关系,即
对于非空的链表,ai-1是ai的唯一直接前驱,ai+1是
12
3.1 链表的基本概念
3.1.1 什么是链表 3.1.2 链表的逻辑结构 3.1.3 链表的存储结构 ☞ 3.1.4 静态链表和动态链表 3.1.5 链表的基本运算
13
☞静态链表
静态链表是用地址连续的存储空间(一般使用计算
机语言中的“数组”)存储链表中的元素,及其逻辑后
继在数组中的位置。
与顺序表不同的是,在静态链表中逻辑位置相邻的 元素其物理位置不一定相邻。
310 320 220 160 100 200 210 …
10
Baidu Nhomakorabea
… …
讨论:在该存储方式下,如何找到表中任一元素?
答:在链接存储方式下(链表中),每一个数据元素的存储地址
是存放在其直接前驱结点的next域中,只要知道第一个数据元素 (结点)zhao的存储地址,就可以“顺藤摸瓜”找到其后续的所 有结点。
回顾:
顺序表的特点:逻辑关系上相邻的两个元素在物理存储位置上也 相邻;
优点:可以随机存取表中任一元素O(1);存储空间使用紧凑 缺点:在插入,删除某一元素时,需要移动大量元素O(n);预先 分配空间需按最大空间分配,利用不充分;表容量难以扩充。
讨论:在线性排列的一组数据元素中插入和删除数据元 素时可不可以不移动元素?
答:可以!引入另一种数据结构——链表。
1
第3章 链表及其应用
☞ 3.1 3.2 3.3 3.4 3.5 链表的基本概念 单链表的数据结构 单链表的基本运算实现 循环链表 链表的应用
2
3.1 链表的基本概念
☞ 3.1.1 什么是链表 3.1.2 链表的逻辑结构 3.1.3 链表的存储结构 3.1.4 静态链表和动态链表 3.1.5 链表的基本运算
3
☻ 什么是链表
☞ 链表是满足下列条件的一种数据结构:
⑴ 是有限个具有相同数据类型的数据元素的集合,
D = { ai | i=1,2,…,n,n≥0 ,ai为数据
元素 ⑵ 数据元素之间的关系R = {< ai-1, ai >| ai-1, ai∈D i=2,3,…,n,n≥0}; ⑶ 数据元素ai-1、 ai(i=2,3,…,n,n≥0)在 存储器中占用任意的、连续或不连续物理存储区域 。
我们在本章后续所讨论的链表都是动态链表。
17
3.1 链表的基本概念
3.1.1 什么是链表 3.1.2 链表的逻辑结构 3.1.3 链表的存储结构 3.1.4 静态链表和动态链表 ☞ 3.1.5 链表的基本运算
18
我们可以定义链表的以下6种基本运算:
(1)置空表LLsetnull ( L ) 运算的结果是将链表L置成空
9
【例】设有一组线性排列的数据元素(zhao, qian, sun, li,
zhou, wu, zheng, wang),其链接存储形式如图所示:
存储地址 100 … 160 170 200 210 220 310 320 … … … 数据域 wang … … 指针域 … ∧ …

li zhao wu sun zheng zhou qian … … …
☞ 为确保表中数据元素间的线性逻辑关系,在存储
每一个数据元素的同时,存储其逻辑后继的存储地址;
8
♣ 链表的存储结构
…… ☞ ai的值与ai+1的存储地址共同组成了链表中的一 个结点: data next 其中:data域是数据域,用来存放数据元素ai的值; next域是指针域,用来存放ai的直接后继ai+1的 存储地址。 ☞ 链表正是通过每个结点的指针域将表中n个数据元 素按其逻辑顺序链接在一起的。
另外:链表中的最后一个数据元素无后继,则最后一个 结点(尾结点)的指针域为空。
11
通常情况下,我们用箭头来表示指针域中的指针,
忽略每一个结点的实际存储位置,而重点突出链表中 结点间的逻辑顺序,将链表直观地画成用箭头链接起 来的结点序列。
zhao qian sun li
zhou
wu
zheng
wang ∧
表。
(2)求表长LLlength ( L ) 运算结果是输出链表中数据元
素的个数。
(3)按序号取元素LLget (L ,i ) 当1≤i≤length ( L )时,输
出链表L中第i个结点的值或其地址。
19
(4)按值查找(定位)LLlocate ( L , x ) 当链表L中存
相关文档
最新文档