数据结构课件CHAP003
数据结构ppt3
54
6
6
到一位8进制数则进栈
6
0
6
保存,转换完毕后依
所以:(3456)10 =(6613)8
次出栈则正好是转换 结果。
3.1 栈
3.1.4 栈的应用实例
例3.4
算法设计: 当N>0时,重复(1),(2):
(1)若 N≠0,则将N % r 压入栈s中 ,执行2;若N=0,将栈 s的内容依次出栈,算法结束。
3.1 栈
3.1.1 栈的定义和运算
栈的定义:
栈是只能在一端进行插入和删除的线性表(运算受限)。 由此,栈具有后进先出(LIFO)的特性。
入栈(插入)
栈顶元素
an
…
a2 a1
出栈(删除) 栈顶:插入、删除的一端
栈底:栈顶的另一端
3.1 栈
3.1.1 栈的定义和运算
栈的基本运算:
(1) 初始化栈init_stack(S): 设置栈S为空。
量top来标识栈顶位置。 类型定义如下:
#define maxsize 50 typedef struct
{ elementtype data[maxsize]; int top;
} seqstack; //定义了一个栈类型seqstack seqstack s1,*s; //定义了栈变量s1和指向栈类型的指针s
为此,可采用循环结构来解决,即将Q->data[0]做为Q>data[maxsize-1]的下一个存储位置——循环队列。
3.2 队列
3.2.2 顺序队列与循环队列
1、存储结构
Q->rear
1
Q->data: 0
maxsize-1
Q->front
数据结构教学课件-chap003.ppt
Status Pop (SqStack &S, SElemType &e) { // 若栈不空,则删除S的栈顶元素, // 用e返回其值,并返回OK; // 否则返回ERROR if (S == S.base) return ERROR; e = *--S; return OK;
} 注意:判定栈空的条件S==S.base
}SqStack;
InitStack(&S) DestroyStack(&S)
StackLength(S) StackEmpty(s)
GetTop(S, &e) ClearStack(&S)
Push(&S, e) Pop(&S, &e)
StackTravers(S, visit())
InitStack(&S) 操作结果:构造一个空栈 S。
3.1 栈的类型定义 3.2 栈类型的实现 3.3 栈的应用举例 3.4 队列的类型定义 3.5 队列类型的实现
3.1 栈的类型定义
ADT Stack { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系: R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n } 约定an 端为栈顶,a1 端为栈底。 基本操作:
第三章 栈和队列
通常称,栈和队列是限定插入和删除 只能在表的“端点”进行的线性表。
线性表
Insert(L, i, x) 1≤i≤n+1 Delete(L, i) 1≤i≤n
ቤተ መጻሕፍቲ ባይዱ
栈
Insert(S, n+1, x)
Delete(S, n)
03数据结构基本概念PPT课件
数据结构研究的主要内容
①数据元素之间的逻辑关系 ②采用的存储结构 ③对这些数据元素采用何种方式进行操作
2020/11/23
9
例:数据结构——学生成绩表
✓数据元素(学号、姓名、科目、成绩) ✓数据元素之间的关系(逻辑结构) ✓数据元素的存储(物理结构) ✓对数据元素的操作(增、减、查找、修改等)
33
数据结构上的常见操作
遍历、插入、更新、 删除、 查找、 排序 注意:每个问题都有一种和多种算法
找到效率最高的 以最容易理解的方式设计 设计的算法不容易出错或出错情况较少
2020/11/23
34
算法
算法的评价
时间复杂度
代码的执行时间,一般是以代码实际执行的指令数量(条)
空间复杂度
2020/11/23
11
数据的逻辑结构
数据元素之间关系的描述 描述逻辑结构的方法:描述法和图示法 描述法:
二元组 B = ( K, R )
K:元素集合 R:元素间关系的集合
注意:元素间的关系一般抽象为前驱与后继关 系,即表明结构中,一个元素的前一个元素是 谁,它的后一个元素又是谁
2020/11/23
24
索引存储
方法
为放在内存 中的元素建 索引表
K1
立索引表
1
K3
元素可以离 2
散存放
3
K4
通过查索引 4 表找到需要 索引号
K2
的元素
2020/11/23
联想:图书馆的查书卡
0300 0301 0302 0303 0304 0305 0306 0307 0308 0309
25
散列存储
散列存储方法
2020/11/23
数据结构ppt
数据结构ppt数据结构 PPT引言:数据结构是计算机科学中的重要基础,它探讨了数据的组织、存储和检索方法。
在计算机程序中,数据结构的选择对于程序的性能和效率起着至关重要的作用。
在本次演讲中,将介绍数据结构的基本概念、常见的数据结构类型以及它们的应用。
一、基本概念1.1 数据结构的定义数据结构是一种用于组织和存储数据的方式,它包括数据元素和它们之间的关系。
其中,数据元素是具有相同性质的数据的集合,关系是数据元素之间的逻辑关系。
1.2 数据结构的分类数据结构可以分为线性结构和非线性结构两大类。
1.2.1 线性结构线性结构中的数据元素之间存在一对一的关系,每个元素只有一个直接前驱和一个直接后继。
常见的线性结构有线性表、栈和队列。
1.2.2 非线性结构非线性结构中的数据元素之间存在一对多或多对多的关系,每个元素可以有多个直接前驱和直接后继。
常见的非线性结构有树和图。
二、常见的数据结构类型2.1 数组数组是一种线性结构,它由固定大小的相同类型的元素构成,可以通过索引直接访问元素。
数组的特点是随机访问速度快,但插入和删除操作较慢。
2.2 链表链表也是一种线性结构,它由一系列结点组成,每个结点包含数据和指向下一个结点的指针。
链表的特点是插入和删除操作快,但随机访问速度较慢。
2.3 栈栈是一种特殊的线性结构,它只能在表的一端进行插入和删除操作。
遵循先进后出(LIFO)的原则,所以栈也被称为后进先出(FILO)的数据结构。
2.4 队列队列也是一种特殊的线性结构,它只能在表的一端插入元素,在另一端删除元素。
遵循先进先出(FIFO)的原则。
2.5 树树是一种非线性结构,它由节点和节点之间的连接组成。
树的特点是每个节点可以有多个子节点,但只有一个根节点。
2.6 图图是一种非线性结构,它由节点和节点之间的连接组成。
图的特点是节点之间的关系可以是一对多或多对多的。
三、数据结构的应用3.1 数据库管理系统数据库管理系统是现代计算机应用中广泛使用的一种数据结构,它用于存储和管理大量的数据。
绪论(数据结构教程PPT课件)
在网络传输或文件读写过程中,使 用队列作为缓冲区,暂时存储待处 理的数据,以提高处理效率。
04
串、数组和广义表
串定义及基本操作
串的基本操作包括
赋值操作、连接操作、求串长、比较操作、定位操作等。
串的存储结构包括
顺序存储结构和链式存储结构。
串模式匹配算法
串模式匹配算法是指在一个主串中寻找一个子串(模式串)的位置。
函数调用
在程序执行过程中,使用 栈来保存函数调用的信息, 如函数参数、局部变量和 返回地址等。
队列定义及基本操作
01
队列(Queue)是一种特殊的线性数据结构,其操作在表 的两端进行。一端称为队头(front),另一端称为队尾 (rear)。
02
队列的基本操作包括
03
入队(enqueue):在队尾插入一个元素。
3
线性表的抽象数据类型描述
数据类型名称、数据对象集合、操作集合等
线性表顺序存储结构
01
顺序存储结构的定义
用一段地址连续的存储单元依次存储线性表的数据元素
02
顺序存储结构的基本操作实现
创建、初始化、销毁、判空、清空、求长度、获取元素、修改元素等操
作的实现方法
03
顺序存储结构的优缺点
无需为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速
线索二叉树
线索二叉树是对二叉树的每个结点增设两个标志位以及一条线索而得到的。根据线索性质的不同,线索二叉树可分为前序线 索二叉树、中序线索二叉树和后序线索二叉树三种。这里以中序线索二叉树为例来说明线索二叉树的构造方法。
中序线索二叉树的构造规则是:若将二叉树的中序遍历序列中的每个结点都看作是相应指针域为空的指针,则称这些指针为 线索,而指向其前驱或后继的指针称为线索指针。加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树 (Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 。
chap003 栈和队列-数据结构(C语言版)-严蔚敏-清华大学出版社
例三、行编辑程序问题
如何实现?
“每接受一个字符即存入存储器” ?
并不恰当!
在用户输入一行的过程中,允许 用户输入出差错,并在发现有误时 可以及时更正。 合理的作法是:
设立一个输入缓冲区,用以接受 用户输入的一行字符,然后逐行存 入用户数据区,并假设“#”为退格 符,“@”为退行符。
GetTop(S, &e) 初始条件:栈 S 已存在且非空。 操作结果:用 e 返回 S 的栈顶
元素。
a1 a2 … … an
ClearStack(&S) 初始条件:栈 S 已存在。 操作结果:将 S 清为空栈。
Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新
的栈顶元素。
分析可能出现的不匹配的情况:
• 到来的右括弧并非是所“期待” • 的到;来的是“不速之客”;
• 直到结束,也没有到来所“期待” 的括弧。
算法的设计思想:
1)凡出现左括弧,则进栈;
2)凡出现右括弧,首先检查栈是否空 若栈空,则表明该“右括弧”多余, 否则和栈顶元素比较, 若相匹配,则“左括弧出栈” , 否则表明不匹配。
} // conversion
例二、 括号匹配的检验 假设在表达式中 ([]())或[([ ][ ])] 等为正确的格式, [( ])或([( ))或 (()]) 均为不正确的格式。
则 检验括号是否匹配的方法可用 “期待的急迫程度”这个概念来描述。
例如:考虑下列括号序列: [( [ ][ ] )] 1 2 34 5 6 7 8
switch (ch) {
数据结构 第3章 栈和队列PPT课件
an
情况:
反序:
正序:其他
×
进入
栈
a1
底
******上课时请保持课堂的安静,谢谢大家!!!
30.10.2020
第5页
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ]
×
首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
课堂作业: 1.把输入序列 1 2 3 经过栈的操作可能 的所有结果进行讨论
30.10.2020
× 第9页
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ] 首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
2、栈的五种运算
(1)初始化栈
void inistack(seqstack &s)
{
s.top=0;
}
******上课时请保持课堂的安静,谢谢大家!!!
******上课时请保持课堂的安静,谢谢大家!!!
30.10.2020
第7页
数据结构 电子教案 — [ 湖北汽车工业学院 软件教研室 马春江 特别制作 ] 首页 尾页 上页 下页 范例 讨论 考题 帮助 关于 结束
3.1.3 栈的抽象数据类型描述
ADT Stack is
Data:
含 有 n 个 元 素 a1,a2,a3,…,an, 按 LIFO 规 则 存 放 , 每 个 元 素 的 类 型 都 为 elemtype。
Operation:
Void inistack(&s) //将栈S置为一个空栈(不含任何元素)
Void Push(&s,x) //将元素X插入到栈S中,也称为 “入栈”、 “插 入”、 “压入”
数据结构chap树PPT文档共152页
6
、
露
凝
无
游
氛
,
天
高
风
景
澈
。
7、翩翩新 来燕,双双入我庐 ,先巢故尚在,相 将还旧居。
8
、
吁
嗟
身
后
名
,
于
我
若
浮
烟
。
9、 陶渊 明( 约 365年 —427年 ),字 元亮, (又 一说名 潜,字 渊明 )号五 柳先生 ,私 谥“靖 节”, 东晋 末期南 朝宋初 期诗 人、文 学家、 辞赋 家、散
1
0
、
倚
南
窗
以
寄
傲
,
审
容
膝
之
易
安
。
谢谢!
36、自己的鞋子,自己知道紧在哪里。——西班牙
37、我们唯一不会改正的缺点是软弱。——拉罗什福科
ห้องสมุดไป่ตู้
xiexie! 38、我这个人走得很慢,但是我从不后退。——亚伯拉罕·林肯
39、勿问成功的秘诀为何,且尽全力做你应该做的事吧。——美华纳
40、学而不思则罔,思而不学则殆。——孔子
文 家 。汉 族 ,东 晋 浔阳 柴桑 人 (今 江西 九江 ) 。曾 做过 几 年小 官, 后辞 官 回家 ,从 此 隐居 ,田 园生 活 是陶 渊明 诗 的主 要题 材, 相 关作 品有 《饮 酒 》 、 《 归 园 田 居 》 、 《 桃花 源 记 》 、 《 五 柳先 生 传 》 、 《 归 去来 兮 辞 》 等 。
数据结构课件PPT
二分查找
二分查找法
将有序数据集分成两个部分,每次取中间位置的值与目标值进行比较,根据比 较结果缩小查找范围,直到找到目标值或确定目标值不存在。
优缺点
查找速度快,但要求数据集必须是有序的。
哈希查找
哈希表
利用哈希函数将数据元素映射到内存中的地址,实现数据的 快速查找。
优缺点
查找速度快,但需要解决哈希冲突问题,并可能存在哈希表 过大或过小的问题。
。
数据结构的基本概念
数据结构的基本概念包括:数据、数据 元素、数据类型、数据结构等。
数据结构是指数据的组织形式,即数据 元素之间的相互关系。
数据类型是指一组具有相同特征和操作 的数据对象(如整数、实数、字符串等 )。
数据是信息的载体,是描述客观事物的 符号记录。
数据元素是数据的基本单位,一个数据 元素可以由若干个数据项组成。
稳定排序
归并排序是一种稳定的排序算法,即相等的元素在排序后 保持其原有的顺序。
非递归算法
归并排序是一种非递归算法,即通过迭代方式实现算法过 程。
需要额外的空间
归并排序需要额外的空间来存储中间结果和临时变量。
查找算法
06
线性查找
顺序查找
逐一比对数据元素,直到找到目 标值或遍历完整个数据集。
优缺点
简单易懂,但效率较低,适用于 数据量较小的情况。
拓扑排序的应用
拓扑排序是一种对有向无环图进行排序的算法, 它按照拓扑关系将图的节点排列成一个线性序列 。
有向无环图是一种没有环路的有向图,拓扑排序 可以有效地解决有向无环图的排序问题。
拓扑排序的应用非常广泛,包括确定任务的执行 顺序、确定事件的发生顺序等。
拓扑排序的基本思路是从有向无环图的任一节点 开始,删除该节点,并记录下该节点的所有后继 节点的编号,然后按编号从小到大的顺序重复以 上步骤。
数据结构课件(c语言)
链表
总结词
链表是一种线性数据结构,它通过指针将一系列节点连接起来。
详细描述
每个节点包含数据和指向下一个节点的指针。链表的长度可以在运行时动态改 变。在C语言中,链表通常使用结构体来表示节点,每个节点包含数据和指向下 一个节点的指针。
栈
总结词
栈是一种后进先出(LIFO)的数据结构,它只允许在一端进行插入和删除操作。
THANKS
感谢观看
二分查找
01
02
03
时间复杂度
O(log n),其中n是数据 结构中的元素数量。
适用场景
适用于数据量较大且数据 结构有序的情况。
实现方式
通过比较中间元素与目标 元素的大小,不断缩小查 找范围,直到找到目标元 素或查找范围为空。
哈希查找
01
时间复杂度
O(1),在最理想的情况下。但在哈希冲突较多的情况下,时间复杂度可
数据结构在实际生活中的应用
数据结构不仅在计算机科学和软件开发中有广泛应用,在实际生活中也有着广泛的应用。
数据结构能够有效地处理和管理现实生活中的各种数据,如人口统计数据、交通流量数据、市场调查 数据等。通过合理地组织和存储这些数据,可以更好地进行数据分析、预测和决策,为人们的生活和 工作提供更好的服务。
详细描述
冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序 错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排 序完成。
冒泡排序
时间复杂度:O(n^2),其中n是数组的长度。 空间复杂度:O(1)。
选择排序
总结词:每次从未排序的元 素中选出最小(或最大)的 一个元素,存放到排序序列 的起始位置。
2024版《数据结构图》ppt课件
良好的数据结构可以带来更高的运 行或存储效率,是算法设计的基础, 对程序设计的成败起到关键作用。
常见数据结构类型介绍
线性数据结构
如数组、链表、栈、队 列等,数据元素之间存
在一对一的关系。
树形数据结构
如二叉树、多叉树、森 林等,数据元素之间存
在一对多的关系。
图形数据结构
由顶点和边组成,数据 元素之间存在多对多的
队列定义、特点及应用场景
队列的特点 只能在队尾进行插入操作,队头进行删除操作。
队列是一种双端开口的线性结构。
队列定义、特点及应用场景
应用场景 操作系统的任务调度。 缓冲区的实现,如打印机缓冲区。
队列定义、特点及应用场景
广度优先搜索(BFS)。
消息队列和事件驱动模型。
串定义、基本操作及实现方法
最短路径问题 求解图中两个顶点之间的最短路径,即路径上边 的权值之和最小。
3
算法介绍 Prim算法、Kruskal算法、Dijkstra算法、Floyd 算法等。
拓扑排序和关键路径问题探讨
拓扑排序
对有向无环图(DAG)进行排序, 使得对每一条有向边(u,v),均有
u在v之前。
关键路径问题
求解有向无环图中从源点到汇点 的最长路径,即关键路径,它决
遍历二叉树和线索二叉树
遍历二叉树
先序遍历、中序遍历和后序遍历。遍历算 法可以采用递归或非递归方式实现。
VS
线索二叉树
利用二叉链表中的空指针来存放其前驱结 点和后继结点的信息,使得在遍历二叉树 时可以利用这些线索得到前驱和后继结点, 从而方便地遍历二叉树。
树、森林与二叉树转换技巧
树转换为二叉树
加线、去线、层次调整。将树中的每个结点的所有孩子结点用线连接起来,再去掉与原结点相连的线,最后 将整棵树的层次进行调整,使得每个结点的左子树为其第一个孩子,右子树为其兄弟结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首元素
ai的直接前驱 ai的直接后继 尾元素 n=0时称为
下标,是元素的序 号,表示元素在表 中的位置(位序)
空表
n为元素总个
数,即表长
4
2.1 线性表的类型定义
二、抽象数据类型线性表的定义 ADT List { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } {称 n 为线性表的表长; 称 i 为 ai 在线性表中的位序。} 数据关系: R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }
第二章 线性表
线性表是一种最常用 且最简单的数据结构
线性结构是零或多个数据元素的有限序序列
数据元素之间是一对一的关系
1
线性结构的基本特征为: 1.必存在一个“首元素”; 2.必存在一个 “尾元素” ;
3.除首元素外,每个元素均有一个直接前 驱;
4.除尾元素外,每个元素均有一个直接后 继。
现实生活中线性结构的实例?
<ai-1, ai>
<ai-1, e>, <e, ai>
表长增1
21
3. ListInsert的实现
Status ListInsert_Sq(SqList &L, int i, ElemType e) { //在顺序表L的第 i 个元素之前插入新元素e, // i 的取值范围为 1≤i≤L.length+1 …… //合法性检查,见下页 q = L.elem+ i - 1; // q 指示插入位置 for (p = L.elem + L.length - 1; p >= q; --p) *(p+1) = *p; // 插入位置及之后的元素右移 元素右移 *q = e; // 插入e. L.elem[i-1]=e ++ L.length; // 表长增1 return OK; 算法时间复杂度为: } 22
6
接上
引用型操作:
ListEmpty( L ) ListLength( L ) PriorElem( L, cur_e, &pre_e ) NextElem( L, cur_e, &next_e ) GetElem( L, i, &e ) LocateElem( L, e) 加工型操作: ListTraverse(L) ClearList( &L )
<ai-1, ai>, <ai, ai+1>
表长减1
<ai-1, ai+1>
25
4. ListDelete的实现
Status ListDelete_Sq(SqList &L,int i,ElemType &e) { if ((i < 1) || (i > L.length)) return ERROR;
3. ListInsert的实现 例:ListInsert_Sq(L, 5, 66)
q = L.elem + i-1; // q 指示插入位置 for (p = L.elem+L.length-1; p >= q; --p) *(p+1) = *p; // 插入位置及之后的元素右移 pq p p p
2
第二章 线性表
2.1 线性表的类型定义 2.2 线性表类型的实现 顺序映象
(顺序表)
2.3 线性表类型的实现 链式映象
(链表)
2.4 一元多项式的表示
3
2.1 线性表的类型定义
一、线性表的逻辑结构
线性表:是n 个数据元素的有限序列。
(a1, a2, …,ai-1,ai, ai+1 ,…, an)
查找的基本操作: 将顺序表中的元素 逐个与 e 进行比较。
19
2. LocateElem的实现
int LocateElem_Sq(SqList L, ElemType e) {
//在顺序表中查询数据元素e, //若e存在,则返回它的位序,否则返回 0
int i = 1; // 从第 1 个元素开始 ElemType *p = L.elem; // p 指向第 1 个元素 while ((i <= L.length) && (e==*p)) { ++i; ++p; } //继续查找 if (i <= L.length) return i; //查找成功 else return 0; //不成功 } 算法的时间复杂度为:O(n)
16
ElemType elem[LIST_INIT_SIZE];
2.2 线性表类型的实现--顺序映象
三、顺序表操作的实现 1.InitList(&L) // 结构初始化 2.LocateElem(L, e) //查找元素e 3.ListInsert(&L, i, e) //在第i个位置插入元素e 4.ListDelete(&L, i, e) //删除第i个元素并用e返回
一、线性表的顺序存储结构(一维数组)
例题:一个一维数组M,下标的范围是0 到9,每个数组元素占5个字节。存储器按字 节编址,设数组起始地址是98,则M[3]的起始 地址是 113 。
解:地址计算通式为: LOC(ai) = LOC(a1) + C *(i-1) 因此:LOC( M[3] ) = LOC(M[0]) + C *(3-0) = 98 + 5 × 3 =113
} // InitList_Sq
O(1) 算法时间复杂度:
18
2. LocateElem的实现
LocateElem(L, e)
L.elem
23 75 41 38 54 62 17 p p p i 1 8 4 3 2 38 e = 50
先看一个实例:顺序表的查找
p
p
L.elem+L.length-1 p
PutElem( &L, i, &e ) ListInsert( &L, i, e ) 7 ListDelete(&L, i, &e)
2.1 线性表的类型定义
三、抽象数据类型List的应用
问题:求两个集合的并,即A=A∪B。
分析:分别用两个线性表 La 和 Lb 表示两 个集合 A 和 B ,即集合中的成员成为线性 表中的数据元素。 对线性表作如下操作:扩大线性表La,将 存在于线性表Lb 中而不存在于线性表La 中的数据元素插入到线性表La 中去。
必须掌握
17
1. InitList的实现
//构造一个空的线性表
Status InitList_Sq( SqList &L ) { L.elem = (ElemType*) malloc ( LIST_INIT_SIZEsizeof (ElemType)); if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; //OK是1
14
Hale Waihona Puke 2.2 线性表类型的实现--顺序映象
二、C 语言描述(动态分配的一维数组)
#define LIST_INIT_SIZE 80
// 线性表存储空间的初始分配量
#define LISTINCREMENT 10
// 线性表存储空间的分配增量
struct SqList{ ElemType *elem; //存储空间基址,ElemType可换为int int length; // 当前表长 int listsize; // 当前分配的存储空间大小 } ; //sequential list
//设线性表为 (a1,a2, . . . ,ai,. . . ,an) 5
接上
基本操作(运算):
InitList( &L )//结构初始化操作 操作结果:构造一个空的线性表L。 DestroyList( &L )//结构销毁操作 初始条件:线性表L已存在。 操作结果:销毁线性表L。
引用型操作//读、取 加工型操作//写、存 } ADT List
8
2.1 线性表的类型定义
三、抽象数据类型List的应用 操作步骤(进行List La, Lb 定义并赋值后):
1.从线性表Lb 中依次取出每个数据元素e e=GetElem(Lb, i)//1≤i≤ListLength(Lb)
2.判断e 在线性表La中是否存在 LocateElem(La, e) 3.若不存在,则将其插入到La中 ListInsert(La, ListLength(La)+1, e)
20
3. ListInsert的实现 ListInsert_Sq(SqList &L, int i, ElemType e)
//在顺序表L的第 i 个元素之前插入新元素e , // e 成为第i 个元素; 1≤i≤L.length+1
插入元素时,线性表的逻辑结构发生什么变化?
(a1,…,ai-1,ai,…,an)变为(a1,…,ai-1, e, ai,…,an)
O(n)
3. ListInsert的实现
//合法性检查,以下代码插入到上一页省略号处
if (i < 1 || i > L.length+1) return ERROR; //不合法 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; // 增加存储容量 } 23