武汉理工大学 信息工程学院 数据结构 ppt 课件ch02_2 线性表2-链式表示和实现
合集下载
《数据结构》课件第二章
线性表的基本操作(逻辑)
➢ 构造一个空表L ➢ 获取L的长度(即元素个数) ➢ 访问L中第i个数据元素的值 ➢ 访问L中第i个数据元素的前驱/后继的值 ➢ 在L中第i个元素之前插入新的元素e ➢ 删除L的第i个数据元素
➢ 注意在插入或者删除之后,线性表的长度应 能随之改变
一 顺序存储
➢ 线性表的顺序表示:用一组地址连续的存储单 元依次存储线性表的数据元素。
否
将Temp_b插入到 LC的第k个位置上
Temp_a ≤ Temp_b
是 将Temp_a插入到 LC的第k个位置上
否 i ≤ LA.len 否
j← j + 1
i← i + 1
j ≤ LB.len
Temp_a = Temp_b
是
否
否
j← j + 1
k← k + 1
结束
是
将LA表的第i个元 素插入到LC表的
插入操作的时间复杂度 O(n/2) 链表中的插入、删除操作没有上溢的情况, 并且节省内存资源
思考:若现已知道指向某元素节点的指针 p,希望能在该节点之前插入元素x,该如 何操作?其算法时间复杂度是多少?
3) 单链表的删除
p
删除第i个元素,由e返回值 删除b
a
Hale Waihona Puke bc … 1) 寻找第i-1个结点
2) 保留结点b的地址
9 SHI 5
0
1
1 ZHAO 2
2 QIAN 3
3 SUN 4
4 LI
9
5 ZHOU 6
6 WU 8
7 ZHENG 8
8 WANG 0
9 SHI 5
i=s[i].cur 指针后移
数据结构线性表ppt课件
01
02
03
04
插入操作
在链表的指定位置插入一个新 节点,需要修改相邻节点的指
针。
删除操作
删除链表的指定节点,需要修 改相邻节点的指针。
查找操作
从链表的头节点开始,顺序遍 历链表,直到找到目标元素或
遍历到链表末尾。
遍历操作
从链表的头节点开始,顺序访 问每个节点,直到遍历到链表
末尾。
04 线性表应用举例 与问题分析
多项式表示与计算问题
01
02
03
多项式表示方法
数组表示法和链表表示法 。
数组表示法
将多项式的系数按次序存 放在一个数组中,通过下 标表示对应的幂次。
链表表示法
每个节点包含系数和指数 两个数据域,以及一个指 向下一个节点的指针域。
一元多项式相加算法设计
• 算法思想:将两个多项式中的同类项系数相加,得到新的 多项式。
删除操作
删除指定位置i的元素,需要将i之后的元素都向前移动 一个位置。
03 链式存储结构及 其实现
链式存储结构原理及特点
链式存储结构原理
使用一组任意的存储单元存储线 性表的数据元素(这组存储单元 可以是连续的,也可以是不连续 的)。
链式存储结构特点
逻辑上相邻的元素在物理位置上 不一定相邻,元素之间的逻辑关 系是通过指针链接来表示的。
...,an组成的有序序列。
性质
集合中必存在唯一的一个“第一元素 ”。
集合中必存在唯一的一个“最后元素 ”。
除最后元素之外,均有唯一的后继。
除第一元素之外,均有唯一的前驱。
线性表与数组关系
数组是线性表的一种表现和实现形式。
线性表更侧重于逻辑概念,而数组则是这种逻辑概念在计算机中的一种存储方式。
第2章 线性表 (数据结构教程PPT课件)
3.在数组a中检索(查找)值为X的数据元素
int locate (int a[ ],int n, int x) { int i; i=0; while((i<=n-1)&&(a[i]!=x)) i++; if(i<=n-1) return (i); /*返回的是存储位置*/ else return (0);} }
(2)按值查找即定位 Locate_LinkList(L,x) Lnode * Locate_LinkList( LinkList L, datatype x) /*在单链表L中查找值为x的结点,找到后 返回其指针,否则返回空*/ { Lnode * p=L->next; while ( p!=NULL && p->data != x) p=p->next; return p; }
2.2.2 典型操作的算法实现
1. 初始化线性表L
SeqList *init_SeqList( )
{ SeqList *L; L=malloc(sizeof(SeqList)); L->last=-1; return L; }
2.在数组a第i个数据元素之(ai-1)前插入数据 元素X insert (int a[ ],int n,int i, int x) { int j; for(j=n-1;j>=i-1;j--) a[j+1]=a[j]; /* 结点移动 */ a[i-1]=x; /*新元素插入*/ n++; /*修改长度*/ }
4.删除数组a第i个数据元素(ai-1) delete (int a[ ],int n,int i) { int j; for(j=i;j<=n;j++) a[j-1]=a[j]; /* 结点移动 */ n--; /*修改长度*/ }
武汉理工大学 信息工程学院 数据结构 ppt 课件层次遍历
例:
d=InputBox(“请输入你的出生日期”) InputBox(“请输入你的出生日期 请输入你的出生日期” If Isdate(d) Then Msgbox “你出世已有” _ 你出世已有” & Date - Cdate(d) & “天” Cdate(d) “天 Else Msgbox “输入错误!” 输入错误!
C语言的 语言的switch语句: 语句: 语言的 语句
End Select
OptionButton(单选按钮) (单选按钮)
功能: 功能:用于从多个可选项中选择其中之一
主要属性: 主要属性:
Caption标题 Caption标题 Value 值,布尔量:True-选中,False-不选 布尔量: -选中, - Style 外观: 外观: Standerd-标准方式, Standerd-标准方式,圆形 Graphical-图形方式,象按钮 Graphical-图形方式,
Select case
Select Case 语句
格式: 格式:
Select Case <测试表达式 测试表达式> 测试表达式
[Case ①<取值范围表达式表 取值范围表达式表> 取值范围表达式表 <语句块1>] 语句块1>] [Case ② <取值范围表达式表 取值范围表达式表> 取值范围表达式表 <语句块2>] 语句块2>] [Case ③<取值范围表达式表 取值范围表达式表> 取值范围表达式表 <语句块3>]… 语句块3>]… [Case Else <语句块>] 语句块>] ①②③为表达式取值范围, ①②③为表达式取值范围, 为表达式取值范围 可为: 可为: 常量或常量列表, Case常量或常量列表,如 10,20 Case ② ① Case ③ , 30 Yes 值1 To 值2 如 YesTo 50 Yes Is <比较符 常量,如 Is>50 比较符> 比较符 常量,
数据结构ppt课件完整版
数据结构是计算机中存储、组织 数据的方式,它定义了数据元素 之间的逻辑关系以及如何在计算 机中表示这些关系。
数据结构分类
根据数据元素之间关系的不同, 数据结构可分为线性结构、树形 结构、图形结构等。
4
数据结构重要性
01
02
03
提高算法效率
合理的数据结构可以大大 提高算法的执行效率,减 少时间和空间复杂度。
33
案例三:最小生成树在通信网络优化中应用
Kruskal算法
基于并查集实现,按照边的权值从小到大依次添加边,直到生成 最小生成树。
Prim算法
从某一顶点开始,每次选择与当前生成树最近的顶点加入,直到 所有顶点都加入生成树。
通信网络优化
最小生成树算法可用于通信网络优化,通过选择最优的通信线路 和节点,降低网络建设和维护成本。
2024/1/28
简化程序设计
数据结构的设计和实现可 以简化程序设计过程,提 高代码的可读性和可维护 性。
解决实际问题
数据结构是解决实际问题 的基础,如排序、查找、 图论等问题都需要依赖于 特定的数据结构。
5
相关术语解析
数据元素
数据元素是数据的基本 单位,通常作为一个整
体进行考虑和处理。
2024/1/28
02
队列的基本操作包括入队(enqueue)、出队( dequeue)、查看队首和队尾元素等。
03
队列的特点
2024/1/28
04
数据从队尾入队,从队首出队。
05
队列中元素的插入和删除操作分别在两端进行,因此也称 为双端操作。
06
队列中没有明显的头尾标记,通常通过计数器或循环数组 等方式实现。
15
栈和队列应用举例
数据结构分类
根据数据元素之间关系的不同, 数据结构可分为线性结构、树形 结构、图形结构等。
4
数据结构重要性
01
02
03
提高算法效率
合理的数据结构可以大大 提高算法的执行效率,减 少时间和空间复杂度。
33
案例三:最小生成树在通信网络优化中应用
Kruskal算法
基于并查集实现,按照边的权值从小到大依次添加边,直到生成 最小生成树。
Prim算法
从某一顶点开始,每次选择与当前生成树最近的顶点加入,直到 所有顶点都加入生成树。
通信网络优化
最小生成树算法可用于通信网络优化,通过选择最优的通信线路 和节点,降低网络建设和维护成本。
2024/1/28
简化程序设计
数据结构的设计和实现可 以简化程序设计过程,提 高代码的可读性和可维护 性。
解决实际问题
数据结构是解决实际问题 的基础,如排序、查找、 图论等问题都需要依赖于 特定的数据结构。
5
相关术语解析
数据元素
数据元素是数据的基本 单位,通常作为一个整
体进行考虑和处理。
2024/1/28
02
队列的基本操作包括入队(enqueue)、出队( dequeue)、查看队首和队尾元素等。
03
队列的特点
2024/1/28
04
数据从队尾入队,从队首出队。
05
队列中元素的插入和删除操作分别在两端进行,因此也称 为双端操作。
06
队列中没有明显的头尾标记,通常通过计数器或循环数组 等方式实现。
15
栈和队列应用举例
数据结构线性表ppt课件(2024)
2024/1/30
顺序存储定义
用一段地址连续的存储单元依次 存储线性表的数据元素。
存储方式
逻辑上相邻的元素,其物理存储 位置也相邻。
8
顺序表基本操作实现
初始化操作
创建一个空表,分配存储空间。
插入操作
在指定位置插入一个元素,需移动插入位置后的所有元素。
删除操作
删除指定位置的元素,需移动删除位置后的所有元素。
数据结构线性表ppt课 件
2024/1/30
1
目录
2024/1/30
• 线性表基本概念与特点 • 顺序存储结构及其实现 • 链式存储结构及其实现 • 线性表应用与案例分析 • 线性表性能分析与优化策略 • 总结回顾与拓展延伸
2
01
线性表基本概念与特点
2024/1/30
3
线性表定义及性质
线性表定义:由n(n>=0)个具有相 同类型的数据元素(结点)a1,a2,
动态分配
如果使用动态数组或链表实现线性表,空间复杂度为O(n),其中n为当前线性表中的元素数量。这种 实现方式可以灵活应对元素数量的变化。
2024/1/30
26
优化策略探讨
使用更高效的数据结构
例如,可以使用哈希表或二叉搜索树等数据结构 来优化查找操作的时间复杂度。
批量操作优化
对于批量插入、删除或查找操作,可以通过一次 性处理多个元素来减少操作次数,从而提高效率 。
任何一种逻辑结构都可以用多种存储结构表示。
03
5
线性表基本操作
插入操作
在指定位置插入一 个元素。
查找操作
查找指定元素的位 置。
初始化操作
建立一个空的线性 表。
2024/1/30
顺序存储定义
用一段地址连续的存储单元依次 存储线性表的数据元素。
存储方式
逻辑上相邻的元素,其物理存储 位置也相邻。
8
顺序表基本操作实现
初始化操作
创建一个空表,分配存储空间。
插入操作
在指定位置插入一个元素,需移动插入位置后的所有元素。
删除操作
删除指定位置的元素,需移动删除位置后的所有元素。
数据结构线性表ppt课 件
2024/1/30
1
目录
2024/1/30
• 线性表基本概念与特点 • 顺序存储结构及其实现 • 链式存储结构及其实现 • 线性表应用与案例分析 • 线性表性能分析与优化策略 • 总结回顾与拓展延伸
2
01
线性表基本概念与特点
2024/1/30
3
线性表定义及性质
线性表定义:由n(n>=0)个具有相 同类型的数据元素(结点)a1,a2,
动态分配
如果使用动态数组或链表实现线性表,空间复杂度为O(n),其中n为当前线性表中的元素数量。这种 实现方式可以灵活应对元素数量的变化。
2024/1/30
26
优化策略探讨
使用更高效的数据结构
例如,可以使用哈希表或二叉搜索树等数据结构 来优化查找操作的时间复杂度。
批量操作优化
对于批量插入、删除或查找操作,可以通过一次 性处理多个元素来减少操作次数,从而提高效率 。
任何一种逻辑结构都可以用多种存储结构表示。
03
5
线性表基本操作
插入操作
在指定位置插入一 个元素。
查找操作
查找指定元素的位 置。
初始化操作
建立一个空的线性 表。
2024/1/30
数据结构与算法分析第2章线性表2精品PPT课件
●线性表的逻辑结构特征: (1)有且仅有一个开始结点a1,没有前驱,
只有一个直接后继a2 (2)有且只有一个终端结点an,没有后继,
只有一个直接前驱 (3)其余内部结点ai(1<i<n)有且仅有一个
前驱ai-1和一个后继ai+1
一、线性表的概念
● 线性表的基本运算:创建、删除线性表;增、 删、查、改结点;辅助管理操作:求表长等。
三、链表
(1)单链表——建表算法
● 头插法:
head 123
P->next = head->next Head->next = p
12
1
● 尾插法: head 11
last->next = p p->next = NULL
22
3
三、链表
(1)单链表——结点的删除算法
pre dele
head
3
2
1
Link <T> * head; //定义头指针 int len; //存储链表的长度 public: linkList( ){
head= new Link <T>( ); len=0; } ~linkList( ) { Link<T> *p; while(head!=NULL) {
p=head; head=head->next; date <class T>
Class CarrList:public CList<T>{
●顺pr序Tiva*表taeL::ist;按//T顺类型序的方指式针,存存储储的线性线表性实表例,采用定长 的一维int数ma组xS存ize储; 结//实构例。的最大长度
只有一个直接后继a2 (2)有且只有一个终端结点an,没有后继,
只有一个直接前驱 (3)其余内部结点ai(1<i<n)有且仅有一个
前驱ai-1和一个后继ai+1
一、线性表的概念
● 线性表的基本运算:创建、删除线性表;增、 删、查、改结点;辅助管理操作:求表长等。
三、链表
(1)单链表——建表算法
● 头插法:
head 123
P->next = head->next Head->next = p
12
1
● 尾插法: head 11
last->next = p p->next = NULL
22
3
三、链表
(1)单链表——结点的删除算法
pre dele
head
3
2
1
Link <T> * head; //定义头指针 int len; //存储链表的长度 public: linkList( ){
head= new Link <T>( ); len=0; } ~linkList( ) { Link<T> *p; while(head!=NULL) {
p=head; head=head->next; date <class T>
Class CarrList:public CList<T>{
●顺pr序Tiva*表taeL::ist;按//T顺类型序的方指式针,存存储储的线性线表性实表例,采用定长 的一维int数ma组xS存ize储; 结//实构例。的最大长度
武汉理工大学 信息工程学院 数据结构 ch 排序快速排序PPT课件
22快速排序快速排序从待排序列中任取一个元素从待排序列中任取一个元素例如取第一例如取第一个个作为作为中心中心所有比它小的元素一律前放所所有比它小的元素一律前放所有比它大的元素一律后放形成左右两个子表
10.3 交换排序
交换排序的基本思想是: 两两比较待排序记录的关键 码,如果发生逆序(即排列顺序与排序后的次序正好Байду номын сангаас相反),则交换之,直到所有记录都排好序为止。
例:关键字序列 T=(21,25,49,25*,16,08),请写出冒泡排序的具体实现 过程。
初态: 21,25,49, 25*,16, 08
第1趟
21,25,25*,16, 08 , 49 21,25, 16, 08 ,25*,49
第2趟 21,16, 08 ,25, 25*,49
第3趟 16,08 ,21, 25, 25*,49 第4趟 08,16, 21, 25, 25*,49
作业
以 关 键 字 序 列 ( 256 , 301 , 751 , 129 , 937,863,742,694,076,438)为例,分 别写出执行以下算法的各趟排序结束时,关 键字序列的状态。
① 冒泡排序 ② 快速排序
第13页/共14页
感谢您的观看!
第14页/共14页
详细分析: •最好情况:初始排列已经有序,只执行一趟起泡,做 n-1 次关键码比较,不 移动对象。 •最坏情形:初始排列逆序,算法要执行n-1趟起泡,第i趟(1 i n) 做了n- i 次 关键码比较,执行了n-i 次对象交换。此时的比较总次数KCN和记录移动次数 RMN为:
KCN
n 1
(n i)
快速排序是一个不稳定的排序方法
第11页/共14页
问题2. “快速排序”是否真的比任何排序算法都快?
10.3 交换排序
交换排序的基本思想是: 两两比较待排序记录的关键 码,如果发生逆序(即排列顺序与排序后的次序正好Байду номын сангаас相反),则交换之,直到所有记录都排好序为止。
例:关键字序列 T=(21,25,49,25*,16,08),请写出冒泡排序的具体实现 过程。
初态: 21,25,49, 25*,16, 08
第1趟
21,25,25*,16, 08 , 49 21,25, 16, 08 ,25*,49
第2趟 21,16, 08 ,25, 25*,49
第3趟 16,08 ,21, 25, 25*,49 第4趟 08,16, 21, 25, 25*,49
作业
以 关 键 字 序 列 ( 256 , 301 , 751 , 129 , 937,863,742,694,076,438)为例,分 别写出执行以下算法的各趟排序结束时,关 键字序列的状态。
① 冒泡排序 ② 快速排序
第13页/共14页
感谢您的观看!
第14页/共14页
详细分析: •最好情况:初始排列已经有序,只执行一趟起泡,做 n-1 次关键码比较,不 移动对象。 •最坏情形:初始排列逆序,算法要执行n-1趟起泡,第i趟(1 i n) 做了n- i 次 关键码比较,执行了n-i 次对象交换。此时的比较总次数KCN和记录移动次数 RMN为:
KCN
n 1
(n i)
快速排序是一个不稳定的排序方法
第11页/共14页
问题2. “快速排序”是否真的比任何排序算法都快?
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
讨论2. 如何表示空表 空表? 空表 答: 无头结点时,当头指针的值为空时表示空表; 无头结点时,当头指针的值为空时表示空表 时表示空表; 有头结点时,当头结点的指针域为空时表示空表 时表示空表。 有头结点时,当头结点的指针域为空时表示空表。 头指针
^
头指针
头结点
^
无头结点
有头结点
结构类型的C 结构类型的C语言表示法 教材P28对于单链表的抽象描述:
其它链表形式
讨论1 链表能不能首尾相连?怎样实现? 讨论1: 链表能不能首尾相连?怎样实现? 答:能。只要将表中最后一个结点的指针域指向头结 >next=head;) 点即可 (P->next=head;) 。这种形成环路的链表称 循环链表。 参见教材P35 为循环链表。 参见教材P35
特点: 特点: 1、从任一结点出发均可找到表中其他结点。 从任一结点出发均可找到表中其他结点。 2、操作仅有 一 点与单链表不同:循环条件 点与单链表不同: 单链表 ----- p = NULL 或 p ->next =NULL 循环链表----循环链表----- p= head 或 p->next = head 特别: 特别:带头结点的 空循环链表样式 H
答:头指针是指向 头指针是指向 链表中第一个结点 的指针, 的指针,因此关键 是要寻找第一个结 是要寻找第一个结 地址。 点的地址。 H 31 存储地址 1 7 13 19 25 31 37 43 数据域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU 指针域 43 13 1 NULL 37 7 19 25
注意: 的范 注意:i的范 围,循环执 行完后i的值 行完后 的值 是多少? 是多少?
单链表结点插入的演示
2. 单链表的删除
在链表中删除某元素的示意图如下: 在链表中删除某元素的示意图如下: p a × b × c
p->next
(p->next) -> next
删除步骤(即核心语句): 删除步骤(即核心语句): q = p->next; //保存b的指针,靠它才能指向 保存 的指针,靠它才能指向c p->next=q->next; //a、c两结点相连 、 两结点相连 free(q) ; //删除 结点,彻底释放 删除b结点 删除 结点, 思考: 省略free(q)语句行不行? 语句行不行 思考: 省略 语句行不行?
链表的实现 1. 2. 3. 单链表的插入 单链表的删除 链表的合并
实例1(和顺序表一样):一条记录有学 号和成绩两个数据项,先不考虑有序的 情况编写程序记录数据。
ch2_ltable1.c
1. 单链表的插入
在链表中插入一个元素的示意图如下: 在链表中插入一个元素的示意图如下: p a b p a x b
Pa、Pb用于搜索 和Lb, Pc指向新链表当前结点 、 用于搜索 用于搜索La和 , 指向新链表当前结点 La Pa 3 Pb 2 Pa 5 Pb 6 8 9 Pa 8 Pa 11 ^ Pb 11 ^
Lb
Lc
Pc 2
Pc 3
Pc 5 …
Pc 11 ^
算法实现: 算法实现: Void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) { //按值排序的单链表 按值排序的单链表LA,LB,归并为LC后也按值排序 ,归并为 后也按值排序 按值排序的单链表 pa=La-->next; pb=Lb-->next; Lc=pc=La; //初始化 ; 初始化 while(pa&&pb) //将pa 、pb结点按大小依次插入 中 结点按大小依次插入C中 将 结点按大小依次插入 { if(pa->data<=pb->data) {pc->next=pa; pc=pa; pa=pa->next;} else {pc->next=pb; pc=pb; pb=pb->next} } pc->next = pa?pa:pb ; //插入剩余段 插入剩余段 free(Lb); } //MergeList_L //释放 的头结点 释放Lb的头结点 释放
例: 一个线性表的逻辑结构为: 一个线性表的逻辑结构为:
ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG), ),其存 (ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存 储结构用单链表表示如下,请问其头指针 头指针的 是多少? 储结构用单链表表示如下,请问其头指针的值是多少?
注意: 的范 注意:j的范 围,循环执 行完后j的值 行完后 的值 是多少? 是多少?
单链表结点的删除演示
3. 两个链表的归并(教材P31)
算法要求: 算法要求: 已知: 存储, 已知:线性表 A、B,分别由单链表 LA , LB 存储, 、 ,分别由单链表 其中数据元素按值非递减有序排列, 非递减有序排列 其中数据元素按值非递减有序排列, 要求: 归并为一个新的线性表 为一个新的线性表C 要求:将 A ,B 归并为一个新的线性表 , C 的数据 元素仍按值非递减排列 。设线性表 C 由单链表 LC 存储。 存储。 假设: ( , , , ), ),B=( , , , , ) 假设:A=(3,5,8,11), (2,6,8,9,11) 预测: 预测:合并后 C =( 2 , 3 , 5 , 6 , 8 , 8 , 9 , 11,11 ) ( ,
例 线性表 (ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG) 存储地址 头指针 H 31 1 7 13 19 25 31 37 43 数据域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU 指针域 43 13 1 NULL 37 7 19 25
H ZHAO ZHOU QIAN WU SUN ZHENG LI WANG
数据结构讲义 第2章 线性表
- 链式表示和实现
信息工程学院 魏洪涛
Email:greattide@
2.3 线性表的链式表示和实现
2.3 .1 链表的表示 特点: 特点: 用一组任意的存储单元存储线性表的数据元素 用一组任意的存储单元存储线性表的数据元素 任意 利用指针实现了用不相邻的存储单元存放逻辑上相邻 利用指针实现了用不相邻的存储单元存放逻辑上相邻 指针 的元素 每个数据元素a 除存储本身信息外, 每个数据元素 i,除存储本身信息外,还需存储其直 接后继的信息 结点 – 数据域:元素本身信息 数据域: – 指针域:指示直接后继的存储位置 指针域:
^
与链式存储有关的术语: 与链式存储有关的术语:
1、结点:数据元素的存储映像。由数据域和指针域两部分组成; 、结点:数据元素的存储映像。由数据域和指针域两部分组成; 2、链表: n 个结点由指针链组成一个链表。它是线性表的链式 、链表: 个结点由指针链组成一个链表。 指针链组成一个链表 存储映像,称为线性表的链式存储结构 称为线性表的链式存储结构。 存储映像 称为线性表的链式存储结构 3、单链表、双链表、多链表、循环链表: 、单链表、双链表、多链表、循环链表 • 结点只有一个指针域的链表,称为单链表或线性链表; 结点只有一个指针域的链表,称为单链表 线性链表; 单链表或 • 有两个指针域的链表,称为双链表; 有两个指针域的链表,称为双链表 双链表; • 有多个指针域的链表,称为多链表; 有多个指针域的链表,称为多链表 多链表; • 首尾相接的链表称为循环链表。 首尾相接的链表称为循环链表 循环链表。 循环链表示意图: 循环链表示意图: head a1 a2 …… an head
何谓头指针 头结点和 头指针、 何谓头指针、头结点和首元结点?
头指针 头结点 首元结点
a1Leabharlann 是指向链表中第一个结点(或为头结点 头结点或 头指针是指向链表中第一个结点(或为头结点或为 首元结点)的指针。 首元结点)的指针。 单链表可由一个头指针唯一确定。 单链表可由一个头指针唯一确定。 是在链表的首元结点之前附设的一个结点; 首元结点之前附设的一个结点 头结点是在链表的首元结点之前附设的一个结点; 数据域内只放空表标志和表长等信息; 数据域内只放空表标志和表长等信息; 是指链表中存储线性表第一个数据元素a 首元结点是指链表中存储线性表第一个数据元素a1 的结点。 的结点。
typedef struct Lnode { ElemType data; struct Lnode *next; }Lnode, *LinkList; //数据域 //指针域 // *LinkList为Lnode类型的指针
介绍三个有用的库函数(都在 介绍三个有用的库函数(都在<stdlib.h> 中): sizeof(x)——计算变量 的长度; 计算变量x的长度 计算变量 的长度; malloc(m) —开辟 字节长度的地址空间,并返回这 开辟m字节长度的地址空间 开辟 字节长度的地址空间, 段空间的首地址; 段空间的首地址; free(p) ——释放指针 所指变量的存储空间,即彻底 释放指针p所指变量的存储空间 释放指针 所指变量的存储空间, 删除一个变量。 删除一个变量。
用链表可表示为: 用链表可表示为:
La Lb 头结点
3 2
5 6
8 8
11 9
/\
11
/\
Lc
2 8
8
3
9
5
11
6
11
/\
算法分析: 算法分析:
算法主要包括:搜索、比较、插入三个操作: 算法主要包括:搜索、比较、插入三个操作: 三个操作 搜索:需要两个指针搜索两个链表; 搜索:需要两个指针搜索两个链表; 两个指针搜索两个链表 比较:比较结点数据域中数据的大小; 比较:比较结点数据域中数据的大小; 插入:将两个结点中数据小的结点插入新链表。 插入:将两个结点中数据小的结点插入新链表。 小的结点插入新链表