数据结构C语言版第二章课件严蔚敏

合集下载

教学课件 数据结构--严蔚敏

教学课件 数据结构--严蔚敏
1.1 数据结构讨论的范畴 1.2 基本概念 1.3 算法和算法的量度
1.1 数据结构讨论的范畴
Niklaus Wirth:
Algorithm + Data Structures = Programs
程序设计:
算法: 数据结构:
为计算机处理问题编制 一组指令集
处理问题的策略
问题的数学模型
例如: 数值计算的程序设计问题
结构静力分析计算 ─━ 线性代数方程组
全球天气预报 ─━ 环流模式方程 (球面坐标系)
非数值计算的程序设计问题
例一: 求一组(n个)整数中的最大值 算法: ? 基本操作是“比较两个数的大小” 模型:? 取决于整数值的范围
例二:计算机对弈
算法:? 对弈的规则和策略 模型:? 棋盘及棋盘的格局
例三:足协的数据库管理
S 是 D上关系的有限集。
数据的存储结构
—— 逻辑结构在存储器中的映象
“数据元素”的映象 ?
“关系”的映象 ?
数据元素的映象方法:
用二进制位(bit)的位串表示数据元素 (321)10 = (501)8 = (101000001)2 A = (101)8 = (001000001)2
关系的映象方法:(表示x, y的方法)
抽象数据类型的表示和实现
抽象数据类型需要通过固有数据 类型(高级编程语言中已实现的数据 类型)来实现。
例如,对以上定义的复数。
// -----存储结构的定义
typedef struct { float realpart; float imagpart;
}complex;
// -----基本操作的函数原型说明
顺序映象
以相对的存储位置表示后继关系 例如:令 y 的存储位置和 x 的存储位置之间差一个常量 C

数据结构(严蔚敏)课件 第2章 线性表C(链表的操作)

数据结构(严蔚敏)课件 第2章 线性表C(链表的操作)
//插入非空表的剩余段 //释放Lb的头结点 ?:是条件运算符(为真则取第1项,见P10条件赋值)
22
注:Lc用的是La的头指针

考:
1、不用Lc,直接把La表插到Lb表中;或者 把Lb表插到La表中,怎么修改?
2、重复的数据元素不需要插入,怎么修改?
23
一个带头结点的线性链表类型定义如下 (用类C语言,见P37):
29
续例2:一元多项式的计算 (参见教材P39 – 43) 后续内容
12
(2) 单链表的修改(或读取)
(3) 单链表的插入(P29)
在链表中插入一个元素X 的示意图如下: p a p
b
插 入 X
a
b
p->next
s
X
s->next
链表插入的核心语句: Step 1:s->next=p->next; Step 2:p->next=s ; 思考:Step1和2能互换么?
//链表中元素个数(长度)
表结构
前面的归并算法可改写为P39算法2.21
24
例2:一元多项式的计算 (参见教材P39 – 43) 讨论:
1. 一元多项式的数学通式? 2. 用抽象数据类型如何描述它的定义?
3. 用C语言如何描述它的定义?
4. 如何编程实现两个一元多项式相加?
25
1. 一元多项式的数学通式?
新手特别容易忘记!!
8
void display()
/*字母链表的输出*/
{p=head; sum=0; while (p) //当指针不空时循环(仅限于无头结点的情况) {printf("%c",p->data); p=p->next; //让指针不断“顺藤摸瓜” } sum++; }

数据结构 C语言版(严蔚敏版)第2章 线性表1

数据结构 C语言版(严蔚敏版)第2章 线性表1

• }
• 4. 求线性表L的长度
• int GetLength(SQ_LIST L)
• {
• • } • 5. 判断线性表L是否为空 • int IsEmpty(SQ_LIST L) return (L.length);
• {
• • • } if (L.length==0) return TRUE; else return FALSE;
• 2. 销毁线性表L
• void DestroyList(SQ_LIST *L) • { • if (L->item) free(L->item); 所有存储空间 //释放线性表占据的
• } • 3. 清空线性表L
• void ClearList(SQ_LIST *L) • { • L->length=0; //将线性表的长度置为0
学习提要
3. 熟练掌握线性表在顺序存储结构上实 现基本操作:查找、插入和删除的算法。 4. 熟练掌握在各种链表结构中实现线性 表操作的基本方法,能在实际应用中选用适当 的链表结构。 5. 能够从时间和空间复杂度的角度综合 比较线性表两种存储结构的不同特点及其适用 场合。
2.1线性表及运算
线性表是n个元素的有限序列,它们之间的关系可以 排成一个线性序列:
典型操作的算法实现
• • • • • • • • 1. 初始化线性表L int InitList(SQ_LIST *L) { L->item=(EntryType *)malloc(LIST_MAX_LENGTH *sizeof(EntryType)); //分配空间 if (L->item==NULL) return ERROR; //若分配空间 不成功,返回ERROR L->length=0; //将当前线性表长度置0 return OK; //成功返回OK }

数据结构-清华大学严蔚敏2

数据结构-清华大学严蔚敏2

为了正确表示结点间的逻辑关系,在存储每个结点 值的同时,还必须存储指示其直接后继结点的地址(或 位置),称为指针(pointer)或链(link),这两部分组 成了链表中的结点结构,如图2-2所示。
链表是通过每个结点的指针域将线性表的n个结点 按其逻辑次序链接在一起的。
每一个结只包含一个指针域的链表,称为单链表。 为操作方便,总是在链表的第一个结点之前附设一 个头结点(头指针)head指向第一个结点。头结点的数 据域可以不存储任何信息(或链表长度等信息)。
1. 数据结构的存储方式
数据结构在计算机内存中的存储包括数据元素 的存储和元素之间的关系的表示。
元素之间的关系在计算机中有两种不同的表示方 法:顺序表示和非顺序表示。由此得出两种不同的存储 结构:顺序存储结构和链式存储结构。
• 顺序存储结构:用数据元素在存储器中的相对位 置来表示数据元素之间的逻辑结构(关系)。
◆ rear所指的单元始终为空。
◆ 循环队列为空:front=rear 。 ◆ 循环队列满: (rear+1)%MAX_QUEUE_SIZE =front。
3.3.3 队列的链式表示和实现
1 队列的链式存储表示
队列的链式存储结构简称为链队列,它是限制仅 在表头进行删除操作和表尾进行插入操作的单链表。
数据的逻辑结构和物理结构是密不可分的两个方 面,一个算法的设计取决于所选定的逻辑结构,而算法 的实现依赖于所采用的存储结构。
数据结构的三个组成部分: 逻辑结构: 数据元素之间逻辑关系的描述
D_S=(D,S)
存储结构: 数据元素在计算机中的存储及其逻辑
关系的表现称为数据的存储结构或物理结构。
数据操作: 对数据要进行的运算。
3.3 队 列

数据结构严蔚敏ppt课件

数据结构严蔚敏ppt课件

数据结构严蔚敏ppt课件数据结构(严蔚敏)版●资料上传者:安徽大学研究生●资料使用范围:各大学考研及本科教学●欢迎报考安徽大学研究生●“星光考研书屋”祝您学习愉快[学习目标]掌握线性表的顺序存储结构和抽象数据类型中定义的每一种操作的含义,在顺序存储方式下每一种操作的具体实现和相应的时间复杂度;掌握链接存储的概念,线性表的单、双链接存储结构,对它们进行插入和删除结点的方法,循环单、双链表和带表头附加结点的单、双链表的结构和操作特点;掌握每一种线性表操作在由动态结点构成的单链表上具体实现的算法以及相应的时间复杂度。

2第2章线性表线性结构是最常用、最简单的一种数据结构。

而线性表是一种典型的线性结构。

其基本特点是线性表中的数据元素是有序且是有限的。

在这种结构中:① 存在一个唯一的被称为“第一个”的数据元素;② 存在一个唯一的被称为“最后一个”的数据元素;③ 除第一个元素外,每个元素均有唯一一个直接前驱;④ 除最后一个元素外,每个元素均有唯一一个直接后继。

32.1 线性表的逻辑结构线性表(Linear List ) :是由n(n ≧0)个数据元素(结点)a 1,a 2,…a n 组成的有限序列。

该序列中的所有结点具有相同的数据类型。

其中数据元素的个数n 称为线性表的长度。

当n=0时,称为空表。

当n>0时,将非空的线性表记作: (a 1,a 2,…a n ) a 1称为线性表的第一个(首)结点,a n 称为线性表的最后一个(尾)结点。

2.1.1 线性表的定义4a1,a2,…a i-1都是a i(2≦i≦n)的前驱,其中a i-1是a i的直接前驱;a i+1,a i+2,…a n都是a i(1≦i ≦n-1)的后继,其中a i+1是a i 的直接后继。

2.1.2线性表的逻辑结构线性表中的数据元素a i所代表的具体含义随具体应用的不同而不同,在线性表的定义中,只不过是一个抽象的表示符号。

◆线性表中的结点可以是单值元素(每个元素只有一个数据项) 。

数据结构(C)严蔚敏

数据结构(C)严蔚敏

选择合适的数据结构
选择原则
根据实际应用场景和需求,选择 最合适的数据结构。
常见数据结构
数组、链表、栈、队列、树、图等, 各有其特点和适用场景。
案例分析
例如,对于频繁进行查找操作的数 据,哈希表可能更合适;对于需要 频繁插入和删除元素的数据,链表 可能更合适。
空间和时间复杂度的优化
空间优化
通过减少数据存储空间的占用,提高数据结构的效率。
VS
快速排序
通过一趟排序将要排序的数据分割成独立 的两部分,其中一部分的所有数据都比另 一部分的所有数据要小,然后再按此方法 对这两部分数据分别进行快速排序,整个 排序过程可以递归进行,以此达到整个数 据变成有序序列。
排序算法
归并排序
将两个或两个以上的有序表组合成一个新的 有序表。
堆排序
利用堆这种数据结构所设计的一种排序算法。
数据结构(C)严蔚敏
目 录
• 引言 • 线性数据结构 • 非线性数据结构 • 数据结构的应用 • 数据结构的优化和改进建议
01 引言
什么是数据结构
定义
数据结构是计算机中数据的组织形式, 它根据数据特征将数据分成不同的类 型,并确定数据之间的相互关系。
数据结构的组成
包括数据的逻辑结构、物理结构和数 据的运算。
时间优化
通过改进算法和数据结构,减少数据操作的时间复杂度。
案例分析
例如,对于数组的插入和删除操作,可以通过二分查找法 将时间复杂度从O(n)降低到O(logn)。
算法的优化和改进
算法优化
通过改进算法逻辑,提高数据处理的效率。
算法改进
通过引入新技术或方法,改进现有算法的性能。
案例分析
例如,对于排序算法,快速排序、归并排序和堆排序各有其特点和适 用场景,可以根据实际情况选择最合适的算法。

数据结构严蔚敏(全部章节814张PPT)-(课件)

数据结构严蔚敏(全部章节814张PPT)-(课件)
① 集合:结构中的数据元素除了“同属于一个集合” 外,没有其它关系。
② 线性结构:结构中的数据元素之间存在一对一的 关系。
③ 树型结构:结构中的数据元素之间存在一对多的 关系。
④ 图状结构或网状结构:结构中的数据元素之间存 在多对多的关系。
图1-3 四类基本结构图
1.1.3 数据结构的形式定义
数据结构的形式定义是一个二元组: Data-Structure=(D,S)
计算机求解问题的一般步骤
编写解决实际问题的程序的一般过程:
– 如何用数据形式描述问题?—即由问题抽象出一个 适当的数学模型; – 问题所涉及的数据量大小及数据之间的关系; – 如何在计算机中存储数据及体现数据之间的关系? – 处理问题时需要对数据作何种运算? – 所编写的程序的性能是否良好? 上面所列举的问题基本上由数据结构这门课程来回答。
其中:D是数据元素的有限集,S是D上关系的有限集。 例2:设数据逻辑结构B=(K,R)
K={k1, k2, …, k9} R={ <k1, k3>,<k1, k8>,<k2, k3>,<k2, k4>,<k2, k5>,<k3, k9>, <k5, k6>,<k8, k9>,<k9, k7>,<k4, k7>,<k4, k6> } 画出这逻辑结构的图示,并确定那些是起点,那些是终点
<基本操作名>(<参数表>) 初始条件: <初始条件描述> 操作结果: <操作结果描述>
– 初始条件:描述操作执行之前数据结构和参数应 满足的条件;若不满足,则操作失败,返回相应的出 错信息。

数据结构讲义绪论严蔚敏c语言版.ppt

数据结构讲义绪论严蔚敏c语言版.ppt

在计算机科学中,数据的含义极为广泛,包括数值型、非 数值型、多媒体数据等。

数据元素(Data Element): 是数据的基本单位,在计算机程 序中通常作为一个整体进行考虑和处理。Eg. “图”中的圆 圈。 一个数据元素可由若干个数据项(Data Item)组成。数据 项是数据的不可分割的最小单位。 Eg. “书目”中的书名。

数据对象(Data Object) : 是性质相同的数据元素的集合。是 数据的一个子集。 Eg. C={ “ A’’, “ B”, · · · ,“Z”}
7
2019/3/20
1.2 基本概念和术语

数据结构(Data Structure):是相互之间存在一种或多种特
定关系的数据元素的集合。数据元素相互之间的关系称为 结构。通常分为四类基本结构: 1、集合 数据元素除了同属于一种类型外,别无其它关系。 2、线性结构 数据元素之间存在一对一的关系。 3、树形结构 数据元素之间存在一对多的关系。 4、图状结构 数据元素之间存在多对多的关系。
数据结构
(Data Structure)
柳 青
Email: liuqing@
School of Software , Yunnan University
2019/3/20
1
数据结构教材及参考材料

《数据结构》 (C语言版)

严蔚敏 吴伟民
清华大学出版社

《数据结构题集》

严蔚敏 吴伟民
英文字符类型的数据对象是{A,B,C,D,E,F,…}

数据对象可以是有限的,也可以是无限的。 数据结构不同于数据类型,也不同于数据对象,它不仅要描 述数据类型的数据对象,而且要描述数据对象各元素之间的 相互关系。 2019/3/20

数据结构(C)严蔚敏-(文件)PPT课件

数据结构(C)严蔚敏-(文件)PPT课件

2021/3/12
Page 2
单关键字文件
❖ 文件中的记录只有一个唯一标识记录的主关键字。
多关键字文件
❖ 文件中的记录除了含有一个主关键字外,还含有若干个次关键字。
记录的属性
❖ 记录中所有非关键字的数据项。
记录的逻辑结构
❖ 记录在用户或应用程序员面前呈现的方式,是用户对数据的表示和 存取方式。
文件的检索方式
❖ 顺序存取:存取下一个逻辑记录。 ❖ 直接存取;存取第i个逻辑记录。 ❖ 按关键字存取:
简单查询、区域查询、函数查询、布尔查询
Data Structure
2021/3/12
Page 4
文件的修改
❖ 记录的插入、删除、修改。
文件的物理结构
❖ 文件在外存上的组织方式。 ➢ 顺序组织 ➢ 随机组织 ➢ 链组织
记录的物理结构
❖ 数据在物理存储器上存储的方式,是数据的物理表示和组织。
Data Structure
2021/3/12
Page 3
物理记录
❖ 计算机用一条I/0命令进行读写的基本数据单位(物理块)。 ❖ 物理记录和逻辑记录之间可能存在下列三种关系:
➢ 一个物理记录存放一个逻辑记录; ➢ 一个物理记录包含多个逻辑记录; ➢ 多个物理记录表示一个逻辑记录。
项。索引项指出该记录的物理地址。最后,索引表按关键字排序。 ❖ 只能存储在磁盘存储设备上。
Data Structure
2021/3/12
Page 8
物理记录号 职工号 姓名 职务 其他
101
29 张珊 程序员
103
05 李四 维修员
104
02 王红 程序员
105
38 刘淇 穿孔员

《数据结构C语言版》严蔚敏第二章逻辑代数基础

《数据结构C语言版》严蔚敏第二章逻辑代数基础

ABC
BC A 00 01 11 10
00 0 1 0 10 0 1 1
ABC ABC BC
ABC
(2-45)
BC A 00 01 11 10
00 0 1 0
10 0 1 1 ?
AB
(2-46)
化简过程:
BC BC A 00 01 11 10 00 0 1 0 10 0 1 1
F=AB+BC
数字电路
第二章 逻辑代数基础
(2-1)
§ 1.2 逻辑代数及运算规则
1.2.1 逻辑代数与基本逻辑关系
在数字电路中,我们要研究的是电路 的输入输出之间的逻辑关系,所以数字电 路又称逻辑电路,相应的研究工具是逻辑 代数(布尔代数)。
在逻辑代数中,逻辑函数的变量只能 取两个值(二值变量),即0和1,中间值 没有意义,这里的0和1只表示两个对立的 逻辑状态,如电位的低高(0表示低电位, 1表示高电位)、开关的开合等。
(2-19)
5. 反演定理(特例):
A•B A B A B A•B
可以用列真值表的方法证明:
A
B AB A• B A
B AB
00
01
1
1
1
01
01
1
0
1
10
01
0
1
1
11
10
0
0
0
(2-20)
6. 对偶定理: 对任何一个逻辑式Y,
• , •,0 1,1 0, 原变量 Y反变量YD 若两反逻变辑量式相等原,变则它量们的对偶式也相等。
逻辑符号
R
EA
F
(2-7)
逻辑式
FA
AF 01 10

教案数据结构严蔚敏第2章线性表(完整版)

教案数据结构严蔚敏第2章线性表(完整版)
}
引用类型作形参的三点说明
(1)传递引用给函数与传递指针的效果是一 样的,形参变化实参也发生变化。 (2)引用类型作形参,在内存中并没有产生 实参的副本,它直接对实参操作;而一般变 量作参数,形参与实参就占用不同的存储单 元,所以形参变量的值是实参变量的副本。 因此,当参数传递的数据量较大时,用引用 比用一般变量传递参数的时间和空间效率都 好。
顺序存储结构存在问题 存储空间分配不灵活 运算的空间复杂度高
链式存储结构
A17(x)=7+3x+9x8+5x17 B8(x)=8x+22x7-9x8
pa
A -1 7 0 3 1 9 8 5 17
B
-1
8
1
22 7
-9
8
pb
多项式相加
A17(x)=7+3x+9x8+5x17 B8(x)=8x+22x7-9x8
第2章 线性表
徐海霞
近3周 • 第2章 线性表 上课 • 第3章 栈和队列 内容 • 第4章 串、数组和广义表
线性结构
(逻辑、存储 和运算)
线性结构的定义: 若结构是非空有限集,则有且仅有一个开始结 点和一个终端结点,并且所有结点都最多只有一个 直接前趋和一个直接后继。 可表示为:(a1 , a2 , ……,
何仕鹏
王 爽 王亚武 :

女 男 : :
20
19 18
04级计算机2班
04级计算机3班 04级计算机4班 :
数据元素都是记录;
元素间关系是线性
同一线性表中的元素必定具有相同特性
2.2 案例引入
案例2.1 :一元多项式的运算
Pn(x) = p0 + p1x + p2x2 + … + pnxn 线性表P = (p0,p1,p2,…,pn) P(x) = 10 + 5x 指数 (下标i) 系数p[i]

数据结构(严蔚敏)chapter 2 array

数据结构(严蔚敏)chapter 2 array

数据内部封装
方法 接口
lowArray.java只演示了将程序划分为类,我们利用highArray.java 重新分配类之间的责任/任务,从而获悉更多OOP的优点。
.
20
highArray.java取消使用 setElem()和 getElem()方法访问数组 下标, 换用insert(), find()和 delete(). 类自身处理下标问题, 这些方法不需要使用下标作参数。
//--------------------------------------------------------------
arr[0] = 77;
// insert 10 items
arr[1] = 99;
arr[2] = 44;
arr[3] = 55;
arr[4] = 22;
arr[5] = 88;
通常,如果一个类被多个用户使用,那么对 这个类的设计就要求易用性好。
类的用户通过类接口的方式与类相连。 由于类的字段通常是私有 (封装性要求),那么接口
通常指类的方法,即类的方法执行什么操作 ,参数如何?通过调用方法,类用户与类对 象进行交互。
The way that a class user relates to the c. lass is called the class interface. 19
如果访问下标<0或>length的数据项,报错。
.
11
INITIALIZATION
说明: 用{}直接初始化数组,取代了引用声明和使用 new来创建数组;数组大小有列表中元素个数决定
.
12
An array example: Listing 2.1 array.java p23-24

青岛科技大学 数据结构 C语言版 严蔚敏 清华大学出版社 讲义

青岛科技大学 数据结构 C语言版 严蔚敏 清华大学出版社 讲义

JYP
13
1.3 算法定义
数据结构的操作实际上是以算法的形式实现的。
定义:算法是一个有限的指令集合,执行这些指令 可以完成某一特定任务。一个算法还应当满足以下 特性: 输入 零个或多个由外界提供的输入量。 输出 至少产生一个输出量。 确定性 每一指令都有确切的语义,无歧义。 有限性 在执行有限步骤后结束。 有效性 每一条指令都应能经过有限层的表示转 化为计算平台的基本指令,即算法的指令必须是可 行的。
class Circle { // 对象: 几何圆 public: Circle(float r); // 构造函数,创建一个半径为r的对象实例 float Circumference( ); // 返回该实例的周长 float Area( ); // 返回该实例的面积 };
该抽象数据类型的名称为Circle,数据对象定义 为几何圆,操作包括构造函数、计算周长和面积等。 注意:这些定义不依赖于数据对象的具体表示,也 没有给出操作实现的过程。
• 中间层数据结构起着核心作用,称之为建模层。 • 对数据结构的研究产生了一批通用性强、具有很 高实用价值的中间层数据结构,如数组、字符串、 集合、线性表、栈、队列、链表、树、图、符号 表等。
• 系统地学习进而掌握数据结构的知识和方法,对 于提高设计与开发软件系统尤其是复杂软件系统 的能力,无疑是十分重要的。
JYP
7
• 用抽象数据类型(ADT)描述数据抽象与封装是 一种自然、有效的方法。 • 数据类型由一个数据对象的集合和一组作用于这 些数据对象的操作组成。例如,C++的基本数据 类型char、int、float和double等。
• 抽象数据类型是一个数据类型,该数据类型的组 织遵循将数据对象及对这些数据对象的操作的规 格说明与这些数据对象的表示、操作的实现相分 离的原则。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3. ai是第i个元素,称i为数据元素ai在线性表中的位序 。
4.
例子: 英文字母表(A, B, …, Z) ; 车辆登记表 。
5. 线性表的特点
同一性:线性表由同类数据元素组成,每一 个ai必须属于同一数据对象。 有穷性:线性表由有限个数据元素组成, 表 长度就是表中数据元素的个数。
有序性:线性表中相邻数据元素之间存在着 序偶关系<ai, ai+1>。
假设线性表中有n个元素,每个元素占k 个单元,第一个元素的地址为loc(a1),则可 以通过如下公式计算出第i个元素的地址 loc(ai):
loc(ai) =loc(a1)+(i-1)×k
其中loc(a1)称为基地址。
2. 顺序表的特点:
逻辑结构中相邻的数据元素在存储结构中 仍然相邻。
线性表的顺序存储结构是一种随机存取 的存储结构。
} q = &(L.elem[i-1]); for( p = &(L.elem[L.length-1]; p>=q; --p)
*(p+1) = *p; *q = e; ++L.length; return OK;
}
// 越界处理
if ( L.length >= L.listsize ) { newbase = ( ElemType * ) realloc ( L.elem , ( L.listsize + LISTINCREMENT ) * sizeof(ElemType) ); if ( ! newbase ) exit(OVERFLOW) ; L.elem = newbase ; L.listsize += LISTINCREMENT ;
}
算法时间复杂度:
时间主要花在移动元素上,而移动元素的个数取决 于插入元素位置。
i=1,需移动 n 个元素; i=n+1,需移动 0 个元素; i=i,需移动 n – i +1 个元素;
假设pi是在第 i 个元素之前插入一个新元素的概率
则长度为 n 的线性表中插入一个元素所需移动元
n+1
素次数的期望值为: Eis = ∑ pi (n – i + 1)
if( (i<1) || (i>L.length) ) return ERROR;
p = &(L.elem[i-1]); e = *p; q = L.elem+L.length-1; for( ++p; p<=q; ++p)
*(p-1) = *p; --L.length; return OK;
}
算法时间复杂度:
4. 顺序表上基本运算的实现
初始化 Status InitList_Sq ( SqList &L)
{ L.elem = (ElemType * )malloc(LIST_INIT_SIZE* sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK;
顺序表中插入元素
插入 Status ListInsert_Sq (SqList &L, int i, ElemType e) {
if( (i<1) || (i>L.length+1) ) return ERROR;
if(L.length >= L.listsize){ realloc(…); ….; // 越界处理 ;
3. 顺序表的描述:
typedef struct
{
ElemType *elem; //ElemType elem[MAXSIZE];
int
length; //当前长度
int
listsize; //分配的存储容量
} SqList;
typedef # ElemType; #为根据具体问题确定的数据类型 typedef int Status;
时间主要花在移动元素上,而移动元素的个数取决 于删除元素位置。
i=1,需移动n - 1个元素; i=n,需移动0个元素; i=i,需移动n – i 个元素;
假设qi是删除第 i 个元素的概率
则长度为 n 的线性表中删除一个元素所需移动元
n
素次数的期望值为: Edl = ∑ qi (n – i)
i=1
6. 线性表的基本运算
初始化 InitList(&L) 建立一个空表。 求表长 ListLength(L) 返回线性表的长度。 读表元素 GetElem(L, i, &e) 用e返回L中第i个数据元素的 值。 定位 LocateElem(L, e, compare()) 返回满足关系的数据元 素的位序。 插入 ListInsert (&L, i, e) 在L中第i个位置之前插入新的数 据元素e,线性表的长度增1。 删除 ListDelete (&L, i, & e) 删除L的第i个位置上的数据元 素e,线性表的长度减1。 输出 ListDisplay (L) 按前后次序输出线性表的所有元素。
O(ListLength(La)+ListLength(Lb))
例,La = ( 3, 5, 8 ) Lb = ( 2, 6, 8, 9, 15 )
构造 Lc = ( 2, 3, 5, 6, 8, 8, 9, 15 )
首先,La_len = 3;Lb_len = 5;
La
i
3
i
5
i
8
i
Lb
Lc
2
j
(a) 带头结点的空单链表
a1
a2
… an
(b) 带头结点的单链表
单链表存储结构描述:
typedef struct LNode {
ElemType data; struct LNode *next; }LNode, *LinkList;
单链表基本运算实现 (1)初始化线性表InitList(L) 该运算建立一个空的单链表,即创建一个头结点。
if(*pa<=*pb) *pc++ = *pa++; else *pc++ = *pb++; } while(pa<=pa_last) *pc++ = *pa++; while(pb<=pb_last) *pc++ = *pb++; }
顺序表的基础要点:
1. 无需为表示元素间的逻辑关系而增加额外的存储 空间,存储密度大(100%);
2.3 线性表的链式表示和实现
线性表链式存储结构的特点: 用一组任意的存储单元存储线性表的元素,不 要求逻辑上相邻的元素在物理位置上也相邻; 插入删除时不需移动大量元素; 失去顺序表可随机存取的优点。
1. 线性链表(单链表) 结点:数据元素的存储映象。
数据域
指针域
data next
数据域用来存储结点的值;指针域用来存储数 据元素的直接后继的地址(或位置)。
练习1:两个线性表LA和LB分别表示两个集合A和B, 现求一个新的集合A=A∪B。
void union( List &La, List Lb) {
La_len = ListLength(La); Lb_len = ListLength(Lb); for( i=1; i<=Lb_len; i++){
void InitList(LinkList &L) {
L=(LinkList)malloc(sizeof(LNode)); /*创建头结点*/
L->next=NULL; }
(2)销毁线性表DestroyList(L) 释放单链表L占用的内存空间。即逐一释放全部结点 的空间。 void DestroyList(LinkList L) { LinkList p=L, q=p->next;
i=1
设在任何位置插入元素等概率, pi =
1 n+1
Eis =
1
n+1
∑ (n – i + 1) =
n+1 i=1
n 2
O(n)
顺序表的删除:删除第5个元素, 图 顺序表中删除元素
删除 Status ListDelete_Sq (SqList &L, int i, ElemType &e) {
2
6
j
3
8
j
5
9
j
6
15
j
8j8源自算法结束!915
2.2 线性表的顺序表示和实现
1. 顺序表:
存储地址 内存空间状态 逻辑地址
按顺序存 储方式构
lo c(a1) lo c(a1)+ k
a1
1
a2
2


造的线性
表。
lo c(a1)+ (i- 1)k
ai
i




lo c(a1)+ (n- 1)k
an
n 空闲
GetElem(Lb, i, e); if(!LocateElem(La, e, equal))
ListInsert(La, ++La_len, e); } }
O(ListLength(La)×ListLength(Lb))
练习2: 两个线性表LA和LB中的数据元素按值非递
减有序排列,现将LA和LB归并为一个新的线性 表,LC中的数据元素仍按值非递减有序排列。
设删除任何位置的元素等概率, qi =
相关文档
最新文档