朱战立数据结构第05章课件

合集下载

数据结构-使用C语言朱战立

数据结构-使用C语言朱战立
15
课前的话——计算机系列课程之间的联系
计算机概论与上机操作(对 21 世纪公民要求)
程序设计与算法语言(BASIC FORTRAN PASCAL C 等,怎样使用计算机)
计算机组成原理(所有计算机的共性)
微机原理及应用(特定机型介绍,单片机或 8086 PC 机,怎样应用计算机)
控制之路
数据处理之路
2
内容安排

内容
学时 章
内容
学时
1 绪论
4
7 树和二叉树 10
2
线性表
48

10
3 栈和队列
8
9
排序
4
4

2 10
查找
4
5
数组
4
11 上机(共10次) 20
合计
70
3
对学生的几点要求
1、上课认真听讲,适当做好笔记。 2、考试成绩分两部分:平时成绩(包括出勤和上机实验)占
20%,期末成绩占80%。 3、课后需要多读课文和参考书,上网查看相关内容,在理解
不能同时进行比赛的项目之间连上一条边。
(3)某选手比赛的项目必定有边相连(不能 同时比赛)。
12
姓名 丁一 马二 张三 李四 王五
项目1 A C C D B
项目2 B D E F F
项目3 E
F A
只需 安排四 个单位 时间进 行比赛
比赛 比赛项目 时间
1 A,C 2 B,D
3E
4F
13
非数值计算问题:
注意:上机时要必须用具体语言实现,如 C或C++等
37
• 队列的抽象数据类型定义
• ADT Queue{ 数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=1,2, …,n } 约定a1为队列头,an为队列尾。

数据结构PPT课件第5章 图1(ppt文档)

数据结构PPT课件第5章 图1(ppt文档)

39
1、邻接矩阵
用顺序方式或链接方式存储图的顶点表v0,v1,…vn-1 , 图的边用n×n阶矩阵A =(aij)表示,A的定义如下: (a)若图为权图,aij对应边<vi,vj>的权值; (b)若图为非权图,则
(1) aii=0; (2) aij=1,当i≠j且<vi,vj>或(vi,vj)存在时; (3)aij=0,当i≠j且<vi,vj>或(vi,vj)不存在时。 称矩阵A为图的邻接矩阵。
B M
32
有时候,图不仅要表示出元素之间是否存在某种 关系,同时还需要表示与这一关系相关的某些信 息。
例如在计算机网络对应的图中,顶点表示计算机 ,顶点之间的边表示计算机之间的通讯链路。实 际中,为了管理计算机网络,我们需要这个图包 含更多的信息,例如每条通讯链路的物理长度、 成本和带宽等信息。为此,我们为传统图中的每 条边添加相应的数据域以记录所需要的信息。
20
图(a)中,v1到v3之间存在一条路径v1, v2, v5, v4, v3
,同时这也是一条简单路径;v1, v2, v5, v4, v3, v1是 一条简单回路。
v1
v2
v3
v4
(a)
2019/12/5
v1
v2
v5
v3
v4
(b)
《数据结构》国家精品课程
v1
v2
v4
v3
(c)
21
V1
V2
V3
13
定义5.3 在无向图中,若两个顶点w和v之间存在 一条边(w, v),则称w, v是相邻的,二者互为邻 接顶点。
在有向图中,若存在一条边<w, v>,则称顶点w 邻接到顶点v,顶点v邻接自顶点w.

数据结构第5章课件 中国石油大学(华东)

数据结构第5章课件 中国石油大学(华东)
leftChild data rightChild
二叉链表
leftChild
data rightChild
22
二叉树的链表表示(三叉链表)
每个结点增加一个指向双亲的指针parent,使 得查找双亲也很方便。
leftChild data parent rightChild
三叉链表
data
leftChild
27
BinTreeNode *LeftChild (BinTreeNode *current ) { return (current != NULL )? current->leftChild :NULL; } BinTreeNode *RightChild (BinTreeNode *current ) { return ( current!= NULL) ? current->rightChild : NULL; } int Height( ){return Height(root);} int Size( ){return Size(root);} BinTreeNode *GetRoot ( ) const { return root; } void preOrder( ) {preOrder(root);} //前序遍历 void inOrder( ) {inOrder(root);} //中序遍历 void postOrder( ) {postOrder(root);} //后序遍历 void levelOrder( ) ; // 不需要递归,所以直接对外接 口调用即可。层序遍历 28
b
f
c
d
g
6
e
a
b.嵌套集合表示法: b 根据树的集合定义,写出集合划分。 { a, {b,{e},{f}}, {c}, {d,{g}} } e c d

数据结构课件第5章-PPT文档资料

数据结构课件第5章-PPT文档资料
(a) 非紧缩方式; (b) 紧缩方式
第5章 串
5.2.2
和线性表的链式存储结构相类似,串的存储结构也可采用链 式存储结构,即用线性链表来存储串值。在这种存储结构下,存 储空间被分成一系列大小相同的结点,每个结点用data域存放字 符, link域存放指向下一个结点的指针。 这样, 一个串就可以用 一个线性链表来表示。
private { private declaration }
public { public declaration }
end;
第5章 串
这一段程序可看作一个字符串:“type private
Tstring = class
{private declaration } public {public declaration } end;
”, 其中“ ”表示换行符。Delphi的源程序编辑器提供了字符 串的查找与替换功能。 选择“Search”菜单中的“Replace”项, 在对话框中输入要查找字符串‘private’及替代串‘protected’, 如 图 5.1 所 示 , 则 执 行 命 令 后 以 上 程 序 中 的 关 键 字 ‘ private’ 被 ‘protected’替代。
第5章 串 串中任意个连续的字符组成的子序列称为该串的子串。包含 子串的串称为主串。通常称字符在序列中的序号为该字符在串中 的位置。子串在主串中的位置可以用子串的第一个字符在主串中 的位置来表示。
例如, 假设a、 b、 c、 d为如下的四个串:
a =‘Data’
b =‘Structure’
c =‘Data Structure’ d =‘Data Structure’
const maxlen = 允许的串最大长度;

数据结构使用C语言(第4版).PPT课件

数据结构使用C语言(第4版).PPT课件
n(n≥ n0)满足T(n)≤c×f(n) 。
-
16
例1-3 设数组a和b在前边部分已赋值,求如下两个n阶矩 阵相乘运算算法的时间复杂度。
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ c[i][j]=0;
//基本语句1
for(k=0;k<n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j]; //基本语句2
-
4
线性结构:除第一个和最后一个数据元素外,每个

数据元素只有一个前驱和一个后继数据元素。


树结构:除根结点外,每个数据元素只有一个前驱

数据元素,可有0个或若干个后继数据元素。



图结构:每个数据元素可有0个或若干个前驱数据
元素和0个或若干个后继数据元素。
-
5
线性结构
树结构
-
图结构
6
顺序存储结构:把数据元素存储在一块连续地址空
void BubbleSort(int a[],int n)
{ int i,j,flag=1; int temp;
for(i=1;i<n&&flag==1;i++)
{ flag=0;
for(j=0;j<n-i;j++)
{ if(a[j]>a[j+1])
{ flag=1; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
数据间的逻辑关系表现在结点的链接关系上。
-

数据结构详解.ppt

数据结构详解.ppt

n维: Loc[j1,j2,….,jn]=Loc[0,0,…,0]+ (b2*b3*…*bn*j1+b3*b4*…*bn*j2+….+bn*jn-1+jn)*h
令C1=b2*b3*…*bn*h C2=b3*b4*….*bn*h …….. Cn-1=bn*h Ci=Ci+1*bi+1 Cn=h
Loc[j1,j2,….jn]=Loc[0,0,…,0]+ji*Ci
lsls为广义表的为广义表的名称名称nn为广义表的为广义表的长度长度aaii为广义表的为广义表的元素元素每个元素既可以是单个不可分的元素每个元素既可以是单个不可分的元素广义表广义表lsls的的原子原子也可以是一个广义表也可以是一个广义表广义表广义表lsls的的子表子表一般用大写字母表示广义表的名称用小写字母表示原子一般用大写字母表示广义表的名称用小写字母表示原子非空广义表的第一个元素称为非空广义表的第一个元素称为lsls的的表头表头headhead其余元素组成的表其余元素组成的表称为称为lsls的的表尾表尾tailtail广义表是线性表的推广又称列表1
*( A.base+off)=e;
return OK; }
5.3 矩阵的压缩存储
一、特殊矩阵 1.对称矩阵 n阶矩阵满足:aij=aji a11 a12 a13 a31 a32 a33 a41 a42 a43 a14 a34 a44 a15 a35 a45 a55 a65 a16 a36 a46 a56 a66
k=
i(i-1)/2+j j(j-1)/2+i
i j i<j
称sa[1..n(n+1)/2]为a[1..n2]的压缩矩阵 压缩矩阵 a11 a21 a22 a31 a32 a33 a41 a42 a43 a44 a51 a52 a53 a54 a55 a61 a62 a63 a64 a65 a66

【2019年整理】数据结构课件第5章

【2019年整理】数据结构课件第5章

if (pos >maxlen) or (pos < 1) or (s.curlen = maxlen) then showmessage(’error’)
else begin {若插入位置超出串s的长度, } if pos > s.curlen then pos:= s.curlen; {则将其调整至串s的末尾} if s.curlen+t.curlen<maxlen then len:= s.curlen+t.curlen else len:=maxlen; {计算新串长}
为串的长度。 零个字符的串称为空串(null string),长度为零。
第5章 串
串中任意个连续的字符组成的子序列称为该串的子串。包含
子串的串称为主串。通常称字符在序列中的序号为该字符在串中 的位置。子串在主串中的位置可以用子串的第一个字符在主串中 的位置来表示。 例如, 假设a、 b、 c、 d为如下的四个串: a =‘Data’ c =‘Data Structure’ b =‘Structure’ d =‘Data Structure’
一个线性链表来表示。
由于串结构的特殊性,在串的链表结构中常常涉及到结点的
大小问题,即如何确定结点的data域存放字符的个数问题。 通常
情况下,结点的大小为4或1,如图5.3所示。当结点的大小为4时, 串所占用的结点中最后一个结点的 data域不一定全被串值占满,
这时通常补上“#”或其他的非串值字符。
第5章 串
第5章 串
5.1 串的应用实例及概念
5.2 串的存储结构 5.3 串的基本操作 5.4 串的ADT定义及类定义 5.5 实习五:串的演示程序
第5章 串
5.1 串的应用实例及概念

数据结构考研讲义 第五章 图

数据结构考研讲义	第五章	图

第四章图4.1图的概念1.图的定义图是由一个顶点集V和一个弧集R构成的数据结构。

2.图的重要术语;(1)无向图:在一个图中,如果任意两个顶点构成的偶对(v,w)∈E是无序的,即顶点之间的连线是没有方向的,则称该图为无向图。

(2)有向图:在一个图中,如果任意两个顶点构成的偶对(v,w)∈E是有序的,即顶点之间的连线是有方向的,则称该图为有向图。

(3)无向完全图:在一个无向图中,如果任意两顶点都有一条直接边相连接,则称该图为无向完全图。

在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。

(4)有向完全图:在一个有向图中,如果任意两顶点之间都有方向互为相反的两条弧相连接,则称该图为有向完全图。

在一个含有n个顶点的有向完全图中,有n(n-1)条边。

(5)稠密图、稀疏图:若一个图接近完全图,称为稠密图;称边数很少(e<nlogn)的图为稀疏图。

(6)顶点的度、入度、出度:顶点的度(degree)是指依附于某顶点v的边数,通常记为TD(v)。

在有向图中,要区别顶点的入度与出度的概念。

顶点v的入度是指以顶点为终点的弧的数目,记为ID(v);顶点v出度是指以顶点v为始点的弧的数目,记为OD(v)。

TD(v)=ID(v)+OD(v)。

(7)边的权、网图:与边有关的数据信息称为权(weight)。

在实际应用中,权值可以有某种含义。

边上带权的图称为网图或网络(network)。

如果边是有方向的带权图,则就是一个有向网图。

(8)路径、路径长度:顶点vp到顶点vq之间的路径(path)是指顶点序列vp,vi1,vi2,…,vim,vq.。

其中,(vp,vi1),(vi1,vi2),…,(vim,.vq)分别为图中的边。

路径上边的数目称为路径长度。

(9)简单路径、简单回路:序列中顶点不重复出现的路径称为简单路径。

除第一个顶点与最后一个顶点之外,其他顶点不重复出现的回路称为简单回路,或者简单环。

(10)子图:对于图G=(V,E),G’=(V’,E’),若存在V’是V的子集,E’是E的子集,则称图G’是G的一个子图。

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

用压缩存储方式存储,矩阵元素均为整数类型。
(2)编写一个采用压缩存储的n阶对称矩阵的输出函数,要求 输出显示成矩阵形式,设矩阵元素均为整数类型。 ( 3 )设矩阵 A 和矩阵 B 为如下所示的矩阵,编写一个用矩阵 A 和矩阵B作为测试例子的测试上述函数的主程序。
void Add(int a[], int b[], int c[], int n) { int i; for(i = 0; i <= n*(n+1)/2-1; i++) c[i] = a[i] + b[i];
a00的内存单元地址
注:C语言中数组元素采用行主序的存放方法,即行优先顺序。
a0,0 a0,1 … a0,n-1 a1,0 a1,1 … a1,n-1 … … Amn= … … am-1,0 am-1,1 … am-1,n-1
一个m×n的二维数组可以看成是m行的一维数 组,或者n列的一维数组。
3.数组抽象数据类型
5.3 特殊矩阵
特殊矩阵:指有许多值相同的元素或有许多零元素、且值 相同的元素或零元素的分布有一定规律的矩阵。
1.几种特殊矩阵的压缩存储:
(1)n阶对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij=aji (1≤i,j≤n)
则称A为n阶对称矩阵。如图5.1是一个5阶对称矩阵。 1 5 1 3 7 5 0 8 0 0 1 8 9 2 6 3 0 2 5 1 a11 a21 a22 a31 a32 a33 ………………..
列号 列指针数组
1 2 3 4 5 6 7

行指针数组
1 2 3 4 5 6
∧ ∧ ∧ ∧
19 25
11

17

纵向头指针

∧ ∧
37
∧ ∧
纵向指针 非零元素
50

横向指针
行号
横向头指针
作业 1)习题5-1,5-2 ,5-3 ,5-4 习题5-10,5-11
非零元素
17



1 4 7 19 37 50
∧ ∧ ∧
行号
头指针
各单链表均不带头结点。由于每个单链表中的行号 域数值均相同,所以单链表中省略了三元组的行号域, 而把行号统一放在了指针数组的行号域中。
行指针数组结构的三元组链表对于从某行进入后找某 列元素的操作比较容易实现,但对于从某列进入后找某行 元素的操作就不容易实现,为此又提出了三元组十字链表 结构,结构如下:
k=
i(i-1)/2+j-1
当 i ≥j
当i<j
n(n+1)/2 (或空)
注:此时一维数组sa的数据元素个数为(n(n+1)/2)+1个, 其中数组sa的最后一个位置存储A中数值不为0的那个常数。
例5.3 为节省内存,n阶对称矩阵采用压缩存储,要求:
( 1 )编写实现 C = A + B 操作的函数。设矩阵 A、矩阵 B 和矩 阵C均采
}
void Print(int a[], int n) { int i, j, k;
for(i = 1; i <= n; i++)
{ for(j = 1; j <=n; j++) { if(i >= j)k = i * (i - 1) / 2 + j - 1; else k = j * (j - 1) / 2 + i - 1;
}
程序运行输出结果如下: 1 5 9
a a[1]
2 6 10
3 7 11
4 8 12
a[0][0] 1 2 3 a[0][3] 4
a[1]
5
6
7
8
a[3]
9 a[2][0]
10
11
12 a[2][3]
பைடு நூலகம்
注意,二维动态数组的全部存储空间不是一次申请的,所以 二维动态数组的每一维数组在物理上是连续的,而全部二维 动态数组在物理上不一定是连续的。
第5章 数组
主 要 知 识 点
数组的基本概念
动态数组
特殊矩阵
稀疏矩阵
5.1 数组的基本概念
1.数组的定义
数组是n(n>1)个相同数据类型的数据元素 a0,a1,a2,...,an-1构成的占用一块地址连续的内存单元的 有限序列。 数组中任意一个元素可以用该元素在数组中的位置来表示, 数组元素的位置通常称作数组的下标。
稀疏矩阵和对应的三元组线性表
列号 1 行号 1 2 3 4 5 6 2 3 4 5 6 7
0 0 0 19 0 0
0 11 0 17 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 0 0 0 0 0 0 0 50
/*注意元素的排列次序*/
int n = 3;
Add(a, b, c, n); Print(c, n);
}
5.4 稀疏矩阵
1.概念
(1)、稀疏矩阵 矩阵中非零元素的个数远远小于矩阵元素个数。 (2) 、稠密矩阵 一个不稀疏的矩阵。 (3) 、稀疏矩阵压缩存储方法 只存储稀疏矩阵中的非零元素,实现方法是:将每个非 零元素用一个三元组(i,j,aij)来表示,则每个稀疏矩 阵可用一个三元组线性表来表示。
{ int i; for(i = 0; i < row; i++) free(a[i]); free(a);
}
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h> #include “Array.h”
void main(void) { int i, j, c; int row = 3, col = 4, **a;
数组符合线性结构的定义。数组和线性表相比, 相同之处是它们都是若干个相同数据类型的数据元素 a0,a1,a2,...,a0-1构成的有限序列。 不同之处是: (1)数组要求其元素占用一块地址连续的内存单元空间,而 线性表无此要求; (2)线性表的元素是逻辑意义上不可再分的元素,而数组中 的每个元素还可以是一个数组; (3)数组的操作主要是向某个下标的数组元素中存数据和取 某个下标的数组元素,这和线性表的插入、删除操作不同。 线性结构(包括线性表、堆栈、队列、串)的顺序存储结 构实际就是使用数组来存储。可见,数组是其他数据结构实现 顺序存储结构的基础,是软件设计中最基础的数据结构。
三元组链表中每个结点的数据域由稀疏矩阵非零元的行号、 列号和元素值组成。稀疏矩阵三元组线性表的带头结点的三 元组链表结构如图所示,其中头结点的行号域存储了稀疏矩 阵的行数,列号域存储了稀疏矩阵的列数。
行数 列数
h
6 7 头结点
1 3 11
1 5 17
2 2 25
4 1 19
5 4 37
6 7 50
a = Make2DArray(row, col); c = 1; for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
{ } a[i][j] = c; c++;
} for(i = 0; i < row; i++) { for(j = 0; j < col; j++) printf("%5d", a[i][j]); printf("\n"); } Diliver2DArray(a, row);
a[3] = a[4];
取值
//赋值号右边的a[4]是取操作,
//赋值号左边的a[3]是存操作,
取地址
5.2 动态数组
数组有静态存储结构的数组和动态存储结构的数组两种,它 们的区别在于: 静态数组在定义时就必须给出数组个数;
动态数组是在具体申请存储单元空间时才给出数组元素的个数。
例 5-2 定义有 3 行、 4 列整数类型的二维数组 a,先逐行分 别给数组元素赋数据 1 , 2 , ... , 12 ,然后显示数组中的 数值。要求分别把申请二维动态数组的过程和释放二维动 态数组的过程编写成函数。 int **Make2DArray(int row, int col) { int **a, i;

这种三元组链表的缺点是实现矩阵运算操作算法的时间 复杂度高,因为算法中若要访问某行某列中的一个元素时, 必须从头指针进入后逐个结点查找。为降低矩阵运算操作算 法的时间复杂度,提出了行指针数组结构的三元组链表,其 结构如图所示:
列号 行指针数组 0 1 2 3 4 5 1 2 3 4 5 6 3 2 11 25 5
(a)
{{1,3,11},{1,5,17},{2,2,25}, {4,1,19},{5,4,37},{6,7,50}}
(b)
2. 三元组顺序表
指用顺序表存储的三元组线性表。 typedef struct { int i; int j; elemtype d; } DataType; typedef struct { int md; int nd; int td; }TriType;
a = (int **)malloc(row * sizeof(int *));
for (i = 0; i < row; i++) a[i] = (int *)malloc(col * sizeof(int)); return a; }
void Diliver2DArray(int **a, int row)
i
0 1 2 3 4 5 6 1 1 2 4 5 6
相关文档
最新文档