南开大学 数据结构 课件3

合集下载

《数据结构》课件

《数据结构》课件

查找操作
顺序查找
二分查找
链表查找
在顺序存储结构的线性表中,查找操 作需要从线性表的第一个节点开始, 逐个比较节点的数据域,直到找到目 标数据或遍历完整个线性表。时间复 杂度为O(n)。
在有序的顺序存储结构的线性表中, 查找操作可以采用二分查找算法。每 次比较目标数据与中间节点的数据域 ,如果目标数据大于中间节点,则在 右半部分继续查找;否则在左半部分 查找。时间复杂度为O(log n)。
数据结构是算法的基础。许多算法的实现需要依赖于特定的数据结构, 因此掌握常见的数据结构是编写高效算法的关键。
数据结构在解决实际问题中具有广泛应用。无论是操作系统、数据库系 统、网络通信还是人工智能等领域,数据结构都发挥着重要的作用。
数据结构的分类
根据数据的逻辑关系,数据结构可以分为线性结构和非线 性结构。线性结构如数组、链表、栈和队列等,非线性结 构如树形结构和图形结构等。
04
数据结构操作
插入操作
顺序插入
在顺序存储结构的线性表中,插入操作 需要找到插入位置的前驱节点,修改前 驱节点的指针,使其指向新节点,然后 让新节点指向后继节点。如果线性表的 第一个节点是空节点,则将新节点作为 第一个节点。
VS
链式插入
在链式存储结构的线性表中,插入操作需 要找到插入位置的前驱节点,修改前驱节 点的指针,使其指向新节点。如果线性表 的第一个节点是空节点,则将新节点作为 第一个节点。

01
02
03
04
图是一种非线性数据结构,由 节点和边组成,其中节点表示 数据元素,边表示节点之间的
关系。
图具有网络结构,节点之间的 关系可以是任意复杂的,包括
双向、单向、无向等。

数据结构说课ppt课件

数据结构说课ppt课件
(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数
基本概念与术语
据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:
1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。
单链表
链表操作算法:初始化、插入、输出、删除、遍历
8. 在一个单链表中删除q所指结点时,应执行如下操作:
q=p->next;
p->next=( p->next->next );
free(q);//这种题目靠一根指针是没有办法完成的,必须要借助第二根指针。
9. 在一个单链表中p所指结点之后插入一个s所指结点时,应执行:
(2) 若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元
问答题
素,这时,应采用哪种存储表示?为什么?
应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。
03
栈和队列
数据结构说课ppt课件
演讲人
数据结构概述
01
线性表
02
栈和队列
03
目录
01
数据结构概述
基本概念与术语
2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。
(补充:一个数据元素可由若干个数据项组成。数据项是数据的不可分割的最小单位。)
在右侧编辑区输入内容
顺序表的存储效率高,存取速度快。此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。

数据结构课件图演示文稿

数据结构课件图演示文稿
数据结构课件图演示文稿
第一页,共103页。
1. 哥尼斯堡七桥问题
德国古城—哥尼斯堡—普雷格尔河—七
2. 桥问题:从任一桥头出发,依次走过每座
3. 桥,每座桥只走一次,最后回到出发点。
4.
——一笔画问

第二页,共103页。
第三页,共103页。
第四页,共103页。
第7章 图
7.1 基本术语
7.2 存储结构
答:是树!而且是一棵 有向树!
第十二页,共103页。
图的术语(续)
路径: 在图 G=(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1, vp2, …, vpm,到达顶点vj。则称顶点序列 ( vi vp1 vp2 ... vpm vj ) 为 从顶点vi 到顶点 vj 的路径。它经过的边(vi, vp1)、(vp1, vp2)、...、 (vpm, vj)应当是属于E的边。
带权图: 即边上带权的图。其中权是指每条边可以
标上具有某种含义的数值(即与边相关的
数)。
网 : →带权图 连通图: 在无向图中, 若从顶点v1到顶点v2有
路径, 则称顶点v1与v2是连通的。如
果图中任意一对顶点都是连通的, 则 称此图是连通图。
非连通图的极大连通子图叫做连通分量。
强连通图: 在有向图中, 若对于每一对顶点vi和vj, 都
4
第八页,共103页。
稀疏图:边较少的图。通常边数远少于nlogn 稠密图:边很多的图。 无向图中,边数接近n(n-1)/2
有向图中,边数接近n(n-1)
子 图:设有两个图 G=(V, E) 和 G’=(V’, E’)。若 V’ V 且 E’
E, 则称 图G’ 是 图G 的子图。

南开大学数据结构课件

南开大学数据结构课件

top
top
Empty e d c b a Push e top
a Push a e d c b a
top
b a Push b
top
e d c b a Pop e
Push f, overflow
d top c b a Pop d
top
c b a Pop c
top
b a Pop btop来自a Pop a A stack is a data structure in which all insertions and deletions of entries are made at one end, called the top of the stack.
Stacks
The last entry which is inserted is the first one that will be removed.
Create the stack, leaving it empty. Test whether the stack is Empty. Push a new entry onto the top of the stack, provided the stack is not full. Pop the entry off the top of the stack, provided the stack is not empty. Retrieve the Top entry from the stack, provided the stack is not empty.
Error_code Stack ::push(const Stack entry &item);
Pre: None. Post: If the Stack is not full, item is added to the top of the Stack. If the Stack is full, an Error_code of overflow is returned and the Stack is left unchanged.

数据结构ppt

数据结构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课件

数据结构绪论  ppt课件
ppt课件 27 27
1.4 算法和算法分析
2019年3月2日星期六
算法和程序的主要区别:程序是用某种程序设计语言所书 写的一个计算过程。而算法并不一定表现为一个计算机程 序。它可以用不同方式和不同语言来描述。
BEGIN
1t 算法 2i DO UNTIL i>5 t×i t i+1i ENDDO PRINT t
作为描述工具。其描述语法见P10-11。
但上机时要用具体语言实现,如C或C++等
ppt课件 25 25
1.4 算法和算法分析
2019年3月2日星期六
Q1. 什么是算法?
Q2. 算法设计的要求?
Q3. 时间复杂度如何表示?
Q4. 空间复杂度如何表示?
ppt课件 26
26
1.4 算法和算法分析
2019年3月2日星期六
2019年3月2日星期六
【例1】数据管理问题—线性问题
ppt课件 8
8
1.1 什么是数据结构
2019年3月2日星期六
【例2】棋类对弈问题—树型结构
初始棋盘格局
第一步
x
x
x x
第二步
x0
x 0
x
0
x 0
第 N 步
x x x 0x 0x 0 x 0
ppt课件 9
x 0x x0
x 0x x 0
9
1.1 什么是数据结构
ppt课件 30
30
1.4 算法和算法分析
2019年3月2日星期六
3 算法分析
Q3. 时间复杂度如何表示?
• 算法分析方法
• 算法分析的两个主要方面

时间复杂度:算法对时间的需求。 T(n)=O(f(n))

南开大学《数据结构与算法》本科课程教学大纲

南开大学《数据结构与算法》本科课程教学大纲

—旅长。大家制定了选旅长的规则:所有人围成一圈,从 1 到 10 为每个人进 行编号,并设定一个数字 N。然后,从编号为 1 的驴友开始按照编号顺序循 环报数,数到 N 的驴友出圈,重复此过程,最后剩下那个驴友就是旅长。 ) 上机实习 2 线性链表的操作(2 学时) (1)对于最多由 100 名学生的姓名和成绩信息(王洪,90)构成的线性 表建立单向链表,并完成下面的问题: ① 统计成绩大于等于 95 分的人数,并输出这些学生的姓名。 ② 删除成绩小于 20 分的信息。 ③ 以 60 分为分界线,将表中所有小于 60 的信息放在表的前半部分,大 于 60 的元素放在表的后半部分。 (2)有两个带表头结点的存放整数的单向链表 Link1 和 Link2,假设他 们的元素值从左到右递增排列,且没有重复值。设计一个 Merge 函数,该函 数的功能是将这两个单向链表合并成一个元素值仍由小到大排列的单向链表 Link。 (3)设计算法并测试。将单向链表中关键字的值重复的结点删除,使得 链表中各结点的值均不相同。 要求:理解线性表的基本概念和抽象数据类型;掌握线性表的顺序存储 结构和链式存储结构;能够应用线性表解决实际问题;了解线性表的 C++实 现方法;了解循环链表和双向链表。 学时:讲授 4 学时,上机 4 学时。 第 3 部分 栈和队列及基于栈和队列的问题求解 教师讲授内容:栈及其抽象数据类型,栈的表示及实现,队列及抽象数 据类型,队列的表示及实现,stack 容器、queue 容器和 priority_queue 容 器。 学生自学内容:应用实例(教材第 3.5 节) 。 要求:理解栈和队列的基本概念和抽象数据类型;掌握栈和队列的顺序
赵宏,王恺
■ 汉语 □英语 □双语 □其他: ■ 百分制
王恺

数据结构基础讲义ppt课件

数据结构基础讲义ppt课件

三叉链存储
.
Date:May 30, 2020
4.8 二叉树的遍历
IT Education & Training
• 遍历是指按某条搜索路线遍访每个结点且不重复(又 称周游),遍历是树结构插入、删除、修改、查找和 排序运算的前提,是二叉树一切运算的基础和核心。
• 牢记一种约定,对每个结点的查看都是“先左后右”。
例子中的数学模型正是数据结构要讨论的问题。
.
Date:May 30, 2020
1.2 定义
IT Education & Training
•数据结构是一门讨论"描述现实世界实体的数学模型 及其上的操作在计算机中如何表示和实现"的学科。
a. 在解决问题时可能遇到的典型的逻辑结构(数据结构) b. 逻辑结构的存储映象(存储实现) c. 数据结构的相关操作及其实现。(算法)
•二叉树由一个根结点加上两棵分别称为左子树和右子 树的互不相交的树组成:
–每个结点最多只有两棵子树(不存在度大于2的结点) –左子树和右子树次序不能颠倒(有序树)
.
Date:May 30, 2020
4.6 树转化为二叉树
IT Education & Training
•左孩子右兄弟表示法可以将一颗多叉树转化为一颗二
• 数据结构和算法的关系:数据结构是专门研究 数据的存储问题,而对存储后的数据进行相应 的操作就是算法。
.
Date:May 30, 2020
1.5 算法效率的度量
IT Education & Training
• 我们通过大O表示法来表示算法的效率:时 间复杂度、空间复杂度。规则如下:
(1)只关注最高次项,常数项和次要项忽略; (2)时间复杂度是指最坏时间复杂度; (3)只有常数项记做1。

数据结构课件PPT

数据结构课件PPT

二分查找
二分查找法
将有序数据集分成两个部分,每次取中间位置的值与目标值进行比较,根据比 较结果缩小查找范围,直到找到目标值或确定目标值不存在。
优缺点
查找速度快,但要求数据集必须是有序的。
哈希查找
哈希表
利用哈希函数将数据元素映射到内存中的地址,实现数据的 快速查找。
优缺点
查找速度快,但需要解决哈希冲突问题,并可能存在哈希表 过大或过小的问题。

数据结构的基本概念
数据结构的基本概念包括:数据、数据 元素、数据类型、数据结构等。
数据结构是指数据的组织形式,即数据 元素之间的相互关系。
数据类型是指一组具有相同特征和操作 的数据对象(如整数、实数、字符串等 )。
数据是信息的载体,是描述客观事物的 符号记录。
数据元素是数据的基本单位,一个数据 元素可以由若干个数据项组成。
稳定排序
归并排序是一种稳定的排序算法,即相等的元素在排序后 保持其原有的顺序。
非递归算法
归并排序是一种非递归算法,即通过迭代方式实现算法过 程。
需要额外的空间
归并排序需要额外的空间来存储中间结果和临时变量。
查找算法
06
线性查找
顺序查找
逐一比对数据元素,直到找到目 标值或遍历完整个数据集。
优缺点
简单易懂,但效率较低,适用于 数据量较小的情况。
拓扑排序的应用
拓扑排序是一种对有向无环图进行排序的算法, 它按照拓扑关系将图的节点排列成一个线性序列 。
有向无环图是一种没有环路的有向图,拓扑排序 可以有效地解决有向无环图的排序问题。
拓扑排序的应用非常广泛,包括确定任务的执行 顺序、确定事件的发生顺序等。
拓扑排序的基本思路是从有向无环图的任一节点 开始,删除该节点,并记录下该节点的所有后继 节点的编号,然后按编号从小到大的顺序重复以 上步骤。

全套电子课件:数据结构(C语言版)(第三版)

全套电子课件:数据结构(C语言版)(第三版)

例 计算f=1!+2!+3!+…+n!, 用C语言描述。
void factorsum(n) int n;{int i,j;int f,w; f=0; for (i=1,i〈=n;i++) {w=1; for (j=1,j〈=i;j++) w=w*j; f=f+w;} return;
1.2 数据结构的发展简史及其 在计算机科学中所处的地位
• 发展史: 1、 “数据结构”作为一门独立的课程在国外是从1968年才开始设
立的。 2、 1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所
著的《计算机程序设计技巧》第一卷《基本算法》是第一本较 系统地阐述数据的逻辑结构和存储结构及其操作的著作。
⑵ while语句
while (〈条件表达式〉) { 循环体语句; }
• while循环首先计算条件表达式的值,若条件表达式的值非零, 则执行循环体语句,然后再次计算条件表达式,重复执行,直 到条件表达式的值为假时退出循环,执行该循环之后的语句。
⑶ do-while语句
do { 循环体语句 } while(〈条件表达式〉)
• 地位: 1、“数据结构”在计算机科学中是一门综合性的专业基础课。
2、数据结构是介于数学、计算机硬件和计算机软件三者之间 的一门核心课程。
3、数据结构这一门课的内容不仅是一般程序设计(特别是非 数值性程序设计)的基础,而且是设计和实
1.3 什么是数据结构
• 解决非数值问题的算法叫做非数值算法,数据处理方面的算法都 属于非数值算法。例如各种排序算法、查找算法、插入算法、删 除算法、遍历算法等。
• 数值算法和非数值算法并没有严格的区别。

数据结构.ppt

数据结构.ppt

Head a
r
b
c^
sr d ^
•不带头结点的尾插法:插入时,第一个结点的处理与其 它结点的处理有区别。
结束时,空表和非空表的处理有区别。
2020/5/24
数据结构
29
Linklist *CREATLISTR( )
{ char ch;
linklist *head,*s,*r;
head=NULL; r=NULL; ch=getchar( );
顺序表是一种随机存取结构
2020/5/24
数据结构
20
4、顺序表的描述:
typedef int datetype; #define maxsize 1024 typedef struct { datatype data[maxsize];
int last;
0
a1
1
a2
. =(linklist *)malloc(sizeof(linklist)); 释放一个结点 free(p);
2020/5/24
数据结构
26
2.3.2 单链表上的基本运算(实现)
1.建立单链表
方法:从一个空表开始,重复读入数据,生成新结点,将读入数 据存放在新结点的数据域,然后将新结点插入当前链表 中,直到结束。
=(语句频度×语句执行一次所需时间) =语句频度 •算法的时间复杂度:就是算法的时间耗费T(n)
2020/5/24
数据结构
13
第一章 概 论
三、(渐进)时间复杂度(O(f(n))
当问题的规模n趋向无穷大时,时间复杂度T(n)的数量 级(阶)称为算法的渐近时间复杂度,简称时间复杂度
四、最坏时间复杂度
2、结点结构:

南开大学信息科学院数据结构C++课件

南开大学信息科学院数据结构C++课件
– 先根(序)遍历:先访问树的根结点,然后依次先根遍历根的 每棵子树 – 后根(序)遍历:先依次后根遍历每棵子树,然后访问根结点 – 按层次遍历:先访问第一层上的结点,然后依次遍历第二 层,……第n层的结点
A
B
E F G
C
D
H J K L M
I
N
O
A 先序遍历: B E F I G C D H J K L N O M
特点:每一层上的结点数都是最大结点数
完全二叉树
定义:深度为k,有n个结点的二叉树当且仅当其每一个结点 都与深度为k的满二叉树中编号从1至n的结点一一对应时, 称为~ 特点 叶子结点只可能在层次最大的两层上出现 对任一结点,若其右分支下子孙的最大层次为l,则其左 分支下子孙的最大层次必为l 或l+1
– 哈夫曼树(Huffman)——带权路径长度最短的树
• 定义
– 路径:从树中一个结点到另一个结点之间的分支构成这两个 结点间的~ – 路径长度:路径上的分支数 – 树的路径长度:从树根到每一个结点的路径长度之和 – 树的带权路径长度:树中所有带权结点的路径长度之和
记作:wpl
w
k 1
n
k
lk
1 2 4 8 9 10 5 11 12 6 13 14 3 7 15 4 6 2
1 3 5 7
1 2 4 8 9 10 5 11 12 6 3 7 4 2 5 1 3 6
• 1.3 树的存储结构
– 树的存储结构
• 双亲表示法
– 实现:定义结构数组存放树的结点,每个结点含两个域: » 数据域:存放结点本身信息 » 双亲域:指示本结点的双亲结点在数组中位置 – 特点:找双亲容易,找孩子难
55
53

《数据结构实验与实训教程(第3版)》课件

《数据结构实验与实训教程(第3版)》课件

目录第一部分预备知识 (1)预备知识 (1)预备知识实验 (2)第二部分基础实验 (4)实验1 线性表的基本操作 (4)实验2 链表的基本操作 (9)实验3 栈的基本操作 (15)实验4 队列的基本操作 (22)实验5 数组的基本操作 (32)实验6 字符串的基本操作 (36)实验7 二叉树的基本操作 (41)实验8 树的遍历和哈夫曼树 (46)实验9 图的基本操作 (53)实验10 排序 (59)实验11 查找 (64)第三部分课程设计实验 (69)实验1 航空客运订票系统 (69)实验2 汉诺塔游戏程序 (75)实验3 全屏幕编辑程序设计 (79)实验4 旅游路线安排模拟系统 (90)实验6 最小生成树kruskal算法 (93)第一部分预备知识预备知识例1.1#include <stdio.h>int sumabc(int a, int b, int c) /* 求三个整数之和*/{ int s;a=b+c;s=a+b+c;return s;}void displayLine(void){ printf(”----------------------\n“);}void main( ){ int x,y, z ,sabc;x=y=z=8;display(); /* 画一条线*/printf(“\n sum=%d”,sumabc(x,y,z)); /* 在输出语句中直接调用函数sumabc( ) */ printf(“\n %6d%6d%6d”,x,y,z);display();/* 画一条线*/x=2; y=4; z=6;sabc =sumabc(x, y, z); /* 在赋值语句中调用函数sumabc( ) */printf(“\n “ sum=%d”, sabc);printf(“\n %6d%6d%6d”,x,y,z);display();/* 画一条线*/}例1.2int sumabc(int *a, int b, int c){int s;*a=b+c;s=*a+b+c;return s;}预备知识实验int main(){ //在main函数中调用上述声明的函数int n; //记录个数STUDENT stu[MAXSIZE;// 顺序存储结构,方法一静态一维数组。

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

}
3.3 公式化(formula-based)描述
3.3.1 基本概念
用数组来描述线性表实例 数组位置——单元(cell)、节点(node) 每个数组单元保存线性表的一个元素
关键——元素存储位置的映射
实例元素ei保存在哪个数组位置? 公式化方法的优点:简单数学公式搞定! location(i) = i - 1——表元素i保存在数组i1位置处 元素定位(Find)的时间复杂性O(1)
线性表的例子
学生姓名字典序的列表 递增排序的考试分数表 字典序的会议列表 按年代排序的奥运会男篮冠军
需支持的操作
创建一个线性表 确定线性表是否为空 确定线性表的长度 查找第k个元素 搜索指定的元素 删除第k个元素 在第k个元素之后插入一个新元素
抽象数据类型(ADT)
抽象数据类型LinearList { 实例
时间复杂性:Θ(1)
Search操作
template<class T> int LinearList<T>::Search(const T& x) const {// Locate x. Return position of x if found. // Return 0 if x not in list. for (int i = 0; i < length; i++) if (element[i] == x) return ++i; return 0; }
什么是数据结构?
数据结构
对象的实例 对象、实例、构成实例的元素间的关系 操作
3.2 线性表(Linear List)
实例形式: (e1, e2,…, en)
n——有穷自然数,表的长度 ei——表中元素,视为原子 n = 0,空表 0 n > 0,e1——第一个元素,en——最后一个 el优先于e2,e2优先于e3,…——仅有的结构
程序(续)
int z; L.Find(1,z); cout << "First element is " << z << endl; cout << "Length = " << L.Length() << endl; L.Delete(1,z); cout << "Deleted element is " << z << endl; cout << "List is " << L << endl; } catch (...) { cerr << "An exception has occurred" << endl; } }
ቤተ መጻሕፍቲ ባይዱ
3.3.2 内存分配失败处理
class NoMem { public: NoMem() {} }; int my_new_handler(size_t x) { throw NoMem(); return 0; }; _PNH Old_Handler_ = _set_new_handler(my_new_handler);
C++类定义
template<class T> class LinearList { public: LinearList(int MaxListSize = 10); // constructor ~LinearList() {delete [] element;} // destructor bool IsEmpty() const {return length == 0;} int Length() const {return length;} bool Find(int k, T& x) const; // return the k'th element of list in x int Search(const T& x) const; // return position of x LinearList<T>& Delete(int k, T& x); // delete k'th element and return in x LinearList<T>& Insert(int k, const T& x); // insert x just after k'th element void Output(ostream& out) const; private: int length; int MaxSize; T *element; // dynamic 1D array };
插入元素——Insert
插入到第k个元素之后
k是否合法——OutOfBounds异常, Θ(1) 另一种错误:表满——数组无空间容纳新元 素,抛出NoMem异常,这就是不用bad_alloc 的原因。Θ(1) 元素k+1, k+2, …, length向后移动一个位置 Θ((length - k)s)
Θ(length)
使用线性表的例子
创建一个大小为5的整数线性表L 输出该表的长度(0) 在第0个元素之后插入2(表为2) 在第一个元素之后插入6(表为2,6) 寻找并输出第一个元素(2) 输出表的长度(2) 删除并输出第一个元素(6)
程序
#include <iostream.h> #include "llist.h" #include "xcept.h" void main(void) { try { LinearList<int> L(5); cout << "Length = " << L.Length() << endl; cout << "IsEmpty = " << L.IsEmpty() << endl; L.Insert(0,2).Insert(1,6); cout << "List is " << L << endl; cout << "IsEmpty = " << L.IsEmpty() << endl;
first[i]——第i个表的第一个元素在数组中的位置 last[i]——第i个表最后一个元素在数组中的位置
多个表共享空间
设置两个虚拟边界表
first[0]=last[0]=-1 first[m+1]=last[m+1]=MaxSize-1 可以使所有表的处理均相同,无需特别处理 表1和表m “哨兵”技术——利用哨兵避免边界检测
插入操作示意
Insert(3, 7)
Insert函数的实现
template<class T> LinearList<T>& LinearList<T>::Insert(int k, const T& x) {// Insert x after the k'th element. // Throw OutOfBounds exception if no k'th element. // Throw NoMem exception if list is already full. if (k < 0 || k > length) throw OutOfBounds(); if (length == MaxSize) throw NoMem(); // move one up for (int i = length-1; i >= k; i--) element[i+1] = element[i]; element[k] = x; length++; return *this; }
Destroy——析构函数
Find操作
template<class T> bool LinearList<T>::Find(int k, T& x) const {// Set x to the k'th element of the list. // Return false if no k'th; true otherwise. if (k < 1 || k > length) return false; // no k'th x = element[k - 1]; return true; }
0或多个元素的有序集合
操作
Create():创建一个空线性表 Destroy():删除表 IsEmpty():如果表为空则返回true,否则返回false Length():返回表的大小(即表中元素个数) Find(k,x):寻找表中第k个元素,并把它保存到x中;如果不存在, 则返回false Search(x):返回元素x在表中的位置;如果x不在表中,则返回0 Delete(k,x):删除表中第k个元素,并把它保存到x中;函数返回修 改后的线性表 Insert(k,x):在第k个元素之后插入x;函数返回修改后的线性表 Output(out):把线性表放入输出流out之中
时间复杂性:Θ(length)
删除元素——Delete
删除第k个元素
k是否合法——OutOfBounds异常, Θ(1) 元素k+1, k+2, …, length向前移动一个位置— —消除空位,Θ((length - k)s)
Delete(2, x)
Delete的实现
template<class T> LinearList<T>& LinearList<T>::Delete(int k, T& x) {// Set x to the k'th element and delete it. // Throw OutOfBounds exception if no k'th element. if (Find(k, x)) {// move elements k+1, ..., down for (int i = k; i < length; i++) element[i-1] = element[i]; length--; return *this; } Θ((length - k)s) else throw OutOfBounds(); return *this; // visual needs this }
相关文档
最新文档