数据结构第7章 图

合集下载

第七章图状结构

第七章图状结构

图的应用非常广泛。
2
7.1 图的类型定义
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树 7.5 两点之间的最短路径问题 7.6 拓扑排序
7.7 关键路径
3
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构 成的数据结构。 Graph = (V , R ) 其中,R={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。
4
由于“弧”是有方向的,因此称由顶 点集和弧集构成的图为有向图。
例如: G1 = (V1, VR1)
A
B C D E
其中 V1={A, B, C, D, E} VR1={<A,B>, <A,E>,
<B,C>, <C,D>, <D,B>, <D,A>, <E,C> }
5
若<v, w>VR 且<w, v>VR, 则称 (v,w) 为顶点v 和顶点 w 之间存在一条边。 例如: G2=(V2,VR2) V2={A, B, C, D, E, F} VR2={(A,B), (A,E),
0 0 0 1 0 1
0 0 1 0 0 1
1 1 0 0 0 0
0 1 1 1 0 0
24
无向图邻接矩阵表示法特点:
1)无向图邻接矩阵是对称矩阵 2)顶点v的度 3)判断两顶点v、u是否为邻接点 4)顶点不变,在图中增加、删除边 5)适用于边稠密的图;
25
有向图的邻接矩阵 为非对称矩阵
0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0

数据结构复习题-第7章答案2014-6-16

数据结构复习题-第7章答案2014-6-16

、选择题(每小题 1 分,共 10分)1. 一个 n 个顶点的连通无向图,其边的个数至少为( C )。

A.n+l B.n C.n-l D.2n2. 下列哪一种图的邻接矩阵是对称矩阵( B )。

A. 有向图 B. 无向图 C.AOV 网 D.AOE 网5. 无 向 图 G=(V,E ), 其 中 : V={a,b,c,d,e,f}, E={(a,b ),(a,e ),(a,c ),(b,e ),(c,f ), (f,d ),(e,d )} ,由顶点 a 开始对该图进行深度优先遍历, 得到的顶点序列正确的是 ( D )。

A. a,b,e,c,d,f B. a,c,f,e,b,d C. a,e,b,c,f,d D. a,e,d,f,c,b6. 用邻接表表示图进行广度优先遍历时,通常是采用( B )来实现算法的。

A. 栈 B. 队列 C. 树 D. 图7. 以下数据结构中,哪一个是线性结构( D )。

A. 广义表 B. 二叉树 C. 图 D. 栈8. 下面哪一方法可以判断出一个有向图是否有环(回路) ( B )。

A. 最小生成树B. 拓扑排序C. 求最短路径D. 求关键路径 9. 在一个图中,所有顶点的度数之和等于图的边数的( C )倍。

10. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的(B )倍。

A. 1/2B. 1C. 2D. 411. 有 8 个顶点无向图最多有( B )条边。

A. 14 B. 28 C. 56 D. 11212. 有 8 个顶点无向连通图最少有( C )条边。

A. 5 B. 6 C. 7 D. 813. 有 8个顶点有向完全图有( C )条边。

A. 14 B. 28 C. 56 D. 11214. 下列说法不正确的是( A )。

A. 图的遍历是从给定的源点出发每一个顶点仅被访问一次 C. 图的深度遍历不适用于有向图B. 遍历的基本算法有两种:深度遍历和广度遍历 D •图的深度遍历是一个递归过程 二、判断题(每小题 1 分,共 10分)1. n 个顶点的无向图至多有 n (n-1) 条边。

第7章 图-有向无环图

第7章 图-有向无环图

算法的执行步骤: 算法的执行步骤: 1、用一个数组记录每个结点的入度。将入度为零的 、用一个数组记录每个结点的入度。 结点进栈。 结点进栈。 2、将栈中入度为零的结点V输出。 、将栈中入度为零的结点 输出 输出。 3、根据邻接表找到结点 的所有的邻接结点, 并将 、根据邻接表找到结点V的所有的邻接结点 的所有的邻接结点, 这些邻接结点的入度减一。 这些邻接结点的入度减一 。 如果某一结点的入度变 为零,则进栈。 为零,则进栈。
3
2
3、找到全为零的第 k 列,输出 k 、 4、将第 k 行的全部元素置为零 、 行的全部元素置为零
…………………
7
53、4;直至所有元素输出完毕。 、 ;直至所有元素输出完毕。
1 2 3 4 5 6 7
0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
template<class T> int BinaryTree <T>:: NumOfOne ( node <T> *t )
{ int k=0; if (t==NULL ) //空二叉树 //空二叉树 return 0; if (t所指结点 的度为 k=1 所指结点 的度为1) k=1; d1= NumOfOne ( t->lchild); //递归求左子树叶结点数 //递归求左子树叶结点数 d2= NumOfOne ( t->rchild); } //递归求右子树叶结点数 //递归求右子树叶结点数 return (d1+d2+k);
A B
AOE网络:结点为事件,有向边指向表示事件的执行次序。 网络:结点为事件,有向边指向表示事件的执行次序。 网络 有向边定义为活动,边的权值为活动进行所需要的时间。 有向边定义为活动,边的权值为活动进行所需要的时间。

数据结构习题及答案与实验指导(树和森林)7

数据结构习题及答案与实验指导(树和森林)7

第7章树和森林树形结构是一类重要的非线性结构。

树形结构的特点是结点之间具有层次关系。

本章介绍树的定义、存储结构、树的遍历方法、树和森林与二叉树之间的转换以及树的应用等内容。

重点提示:●树的存储结构●树的遍历●树和森林与二叉树之间的转换7-1 重点难点指导7-1-1 相关术语1.树的定义:树是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:①有且仅有一个特定的称为根的结点;②其余的结点可分为m(m>=0)个互不相交的子集T1,T2,…,T m,其中每个子集本身又是一棵树,并称为根的子树。

要点:树是一种递归的数据结构。

2.结点的度:一个结点拥有的子树数称为该结点的度。

3.树的度:一棵树的度指该树中结点的最大度数。

如图7-1所示的树为3度树。

4.分支结点:度大于0的结点为分支结点或非终端结点。

如结点a、b、c、d。

5.叶子结点:度为0的结点为叶子结点或终端结点。

如e、f、g、h、i。

6.结点的层数:树是一种层次结构,根结点为第一层,根结点的孩子结点为第二层,…依次类推,可得到每一结点的层次。

7.兄弟结点:具有同一父亲的结点为兄弟结点。

如b、c、d;e、f;h、i。

8.树的深度:树中结点的最大层数称为树的深度或高度。

9.有序树:若将树中每个结点的子树看成从左到右有次序的(即不能互换),则称该树为有序树,否则称为无序树。

10.森林:是m棵互不相交的树的集合。

7-1-2 树的存储结构1.双亲链表表示法以图7-1所示的树为例。

(1)存储思想:因为树中每个元素的双亲是惟一的,因此对每个元素,将其值和一个指向双亲的指针parent构成一个元素的结点,再将这些结点存储在向量中。

(2)存储示意图:-1 data:parent:(3)注意: Parrent域存储其双亲结点的存储下标,而不是存放结点值。

下面的存储是不正确的:-1 data:parent:2.孩子链表表示法(1)存储思想:将每个数据元素的孩子拉成一个链表,链表的头指针与该元素的值存储为一个结点,树中各结点顺序存储起来,一般根结点的存储号为0。

数据结构教程李春葆课后答案第7章树和二叉树

数据结构教程李春葆课后答案第7章树和二叉树
第 7 章 树和二叉树
教材中练习题及参考答案
1. 有一棵树的括号表示为 A(B,C(E,F(G)),D),回答下面的问题: (1)指出树的根结点。 (2)指出棵树的所有叶子结点。 (3)结点 C 的度是多少? (4)这棵树的度为多少? (5)这棵树的高度是多少? (6)结点 C 的孩子结点是哪些? (7)结点 C 的双亲结点是谁? 答:该树对应的树形表示如图 7.2 所示。 (1)这棵树的根结点是 A。 (2)这棵树的叶子结点是 B、E、G、D。 (3)结点 C 的度是 2。 (4)这棵树的度为 3。 (5)这棵树的高度是 4。 (6)结点 C 的孩子结点是 E、F。 (7)结点 C 的双亲结点是 A。
12. 假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法 计算一棵给定二叉树 b 中的所有单分支结点个数。 解:计算一棵二叉树的所有单分支结点个数的递归模型 f(b)如下:
f(b)=0 若 b=NULL
6 f(b)=f(b->lchild)+f(b->rchild)+1 f(b)=f(b->lchild)+f(b->rchild)
表7.1 二叉树bt的一种存储结构 1 lchild data rchild 0 j 0 2 0 h 0 3 2 f 0 4 3 d 9 5 7 b 4 6 5 a 0 7 8 c 0 8 0 e 0 9 10 g 0 10 1 i 0
答:(1)二叉树bt的树形表示如图7.3所示。
a b c e h j f i d g e h j c f i b d g a
对应的算法如下:
void FindMinNode(BTNode *b,char &min) { if (b->data<min) min=b->data; FindMinNode(b->lchild,min); //在左子树中找最小结点值 FindMinNode(b->rchild,min); //在右子树中找最小结点值 } void MinNode(BTNode *b) //输出最小结点值 { if (b!=NULL) { char min=b->data; FindMinNode(b,min); printf("Min=%c\n",min); } }

数据结构习题与答案图

数据结构习题与答案图

第7章图一、单选题01、在一个图中,所有顶点的度数之和等于图的边数的倍。

A.1/2 B.1C.2D.402、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。

A.1/2B.1 C.2 D.403、有8个结点的无向图最多有条边。

A.14 B.28 C.56 D.11204、有8个结点的无向连通图最少有条边。

A.5 B.6 C.7 D.805、有8个结点的有向完全图有条边。

A.14 B.28 C.56 D.11206、用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。

A.栈 B.队列 C.树 D.图07、用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。

A.栈 B.队列 C.树 D.图08、一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为。

A.O(n)B.O(e)C.O(n+e)D.O(n2)09、已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是。

A.0 2 4 3 1 5 6 B.0 1 3 6 5 4 2C.0 1 3 4 2 5 6 D.0 3 6 1 5 4 210、已知图的邻接矩阵同上题,根据算法,则从顶点0出发,按广度优先遍历的结点序列是。

A.0 2 4 3 6 5 1 B.0 1 2 3 4 5 6C.0 4 2 3 1 5 6 D.0 1 3 4 2 5 611、已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是。

A.0 1 3 2 B.0 2 3 1 C.0 3 2 1 D.0 1 2 3 12、已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是。

A.0 3 2 1 B.0 1 2 3 C.0 1 3 2 D.0 3 1 2 13、图的深度优先遍历类似于二叉树的。

A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历14、图的广度优先遍历类似于二叉树的。

数据结构第七章课后习题答案 (1)

7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。

(2)表示该图的邻接表。

(3)图中每个顶点的度。

解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。

7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。

(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。

数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。

visit[i]数组用来表示顶点i是否被访问过。

遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。

每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。

这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。

另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。

2016年考研核心题型【数据结构部分】【第7章 排序】


温馨提示:快速排序主要考查两点:1、快速排序算法的特点;2、快速排序算法实现; 3、快速排序的过程或者一趟排序的结果。本考点历年考查很多,是复习的重点,请同学们 务必掌握。
接插入排序每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍
然有序。
折半插入排序是对直接插入排序算法的一种改进。由于前半部分为已排好序的数列,
这样我们可以不用按顺序依次寻找插入点,而是采用折半查找的方法来加快寻找插入点的
速度。折半查找的方法来寻找插入位置,可以减少比较次数。但不影响排序的趟数(仍然
本题只剩下希尔排序了,事实上,本题是利用增量为 d=5、3、1 来对关键字{50 , 26 , 38 , 80 , 70 , 90 , 8 , 30 , 40 , 20 }进行希尔排序。其排序过程如图 7.2 所示。
我方慎重声明,各盈利机构若采用我方资料,必追究法律责任
102
2016 年考研核心考点命题思路解密 数据结构 梦享团队主编
1. 对一待排序序列分别进行折半插入排序和直接插入排序,两者之间可能的不同之处是

)。
A. 排序的总趟数
B. 元素的移动次数
C. 使用辅助空间的数量
D. 元素之间的比较次数
【2012 年统考——第 11 题】
【考查内容】直接插入排序和折半插入排序的区别。
【解析】所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。直
一趟冒泡排序结束。
整个排序过程如下图所示。
其过程如图 7.1 所示。
50 40 95 20 15 70 60 45 80
50>40,50和40交换
40 50 95 20 15 70 60 45 80

第7章 (PLASMA)


7.2.1 结构体变量的定义
struct grade { int math; int C_language; int english; float average; }; struct student { long number;

7.2.1 结构体变量的定义

7.3 结构体变量的引用
7.3.1 引用结构体变量的成员 7.3.2 两个相同类型的结构体变量之间相互赋值 7.3.3 结构体变量在函数间的传递
7.3.1 引用结构体变量的成员
任何一个结构体变量不能作为整体输入或输出,为了 实现变量的输入、输出操作,需要对变量中的每一个 成员进行引用。引用结构体变量中成员的方式为: 结构体变量名.成员名 其中,“.”称为成员运算符,具有极高的运算优先 级。若结构体多层嵌套,则需要用若干个成员运算符, 一级一级找到最低一级的成员,只能对最低级的成员 进行赋值、存取或运算。引用内层成员的一般形式是: 结构体变量名.成员名1.成员名2.„.成员名n

7.1 结构体类型的定义
在前几章中,我们已经学习了C语言所提供的一些基本 数据类型,如char、int、float、double等,也学习 了由相同数据类型所组成的数据的集合——数组。但 是在现实生活的很多领域中,经常需要处理一些具有 不同数据类型的数据。例如,处理一个学生的信息时, 学生的学号、姓名、性别、年龄等信息作为学生的属 性,需要作为一个整体来处理。如果采用简单的基本 数据类型来操作,则难以反映出它们之间的内在联系, 并且使程序冗长,降低数据处理的效率,且易出错误。 因此,在C语言中引入了一种能够处理复杂数据的数据 类型——结构体类型。
7.2.2 结构体变量的初始化
或者 struct student wang_lin={0601005,“wang lin”,“M”,19,“Shenyang University of Technology”}; 也可以像数组一样进行不完全的初始化,例如: struct student wang_lin={0601005,“wang lin”,“M ”};

ch7复习及习题-new


有向图的邻接矩阵中第i行“1”的个数是第i个顶点的 ,第i 列“1” 的个数是第i个顶点的 。在无向图的邻接矩阵中, 第i行(列)中 ”1”的个数是第i个顶点的 。

一个有1000个顶点、1000条边的有向图的邻接矩阵有 元素,(是/否)稀疏矩阵。


个矩阵
一个连通图的生成树是该图的 连通子图,n个顶点的无向 连通图的邻接矩阵至少有 个非零元素。 在含 n 个顶点和 e 条边的有向图的邻接矩阵中 , 零元素的个数 为 。 A.e B.2e C.n2-e D.n2-2e


若一个有向图的邻接矩阵中对角线以下元素为0,则该图的拓 扑有序序列必定存在.(对/错) 判断一个有向图是否存在回路除了可用拓扑排序方 法以外,还可用 。

邻接矩阵A=
该图共有

条弧,如果是无向图,该图共有
0 1 0 1 0 1 0 1 0
,该图有
个顶点,如果是有向图,
条边。
n个顶点的无向图采用邻接矩阵表示,图中的边数等于邻接矩 阵中非零元素之和的一半。(对/错)
7. 7 对右图所示的无向带权图,
1) 写出它的邻接矩阵,并按Prim 算法求其最小生成树
2) 写出它的邻接表,并按Kruskal 算法求其最小生成树。
e b a d f h g b a c
e f d
h g
c
7.9 试列出下示图中全部可能的拓 扑有序序列,并指出用算法7.12求 得的是哪个序列(注意:应先确定 其存储结构)。 2 1 5 6 1 2 3 6 4 6 3 4 2 3 4 3 6 4
无 向 图
数 组
邻 接 表
十 字 链 表
邻 遍历 最小生成树 最短路径 接 P K F D 多 D B R R L I 重 F F I U O J 表 S S M S Y K D A L
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第7章 图 本章主要内容: 1、 图的定义 2、 图的存储结构 3、 图的遍历操作 4、 图的几个典型应用问题 本章重点难点: 1、图的遍历操作 2、典型应用问题 7.1 图的定义与基本操作 7.1.1 图的定义及有关术语

1. 图的定义 图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

图 7-1 图的图形表示 在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。

在有向图中,通常将边称作弧,含箭头的一端称为弧头,另一端称为弧尾,记作,它表示从顶点vi到顶点vj有一条边。 若有向图中有n个顶点,则最多有n(n-1)条弧,我们又将具有n(n-1)条弧的有向图称作有向完全图。以顶点v为弧尾的弧的数目称作顶点v的出度,以顶点v为弧头的弧的数目称作顶点v的入度。在无向图中,边记作(vi,vj),它蕴涵着存在< vi,vj>和两条弧。若无向图中有n个顶点,则最多有n(n-1)/2条边,我们又将具有n(n-1)/2条边的无向图称作无向完全图。

2. 图的有关术语 与顶点v相关的边的条数称作顶点v的度。从顶点v到顶点u所经过的各条边构成的集合称为一条路径。路径上边或弧的数目称为路径长度。若第一个顶点和最后一个顶点相同,则这条路径是一条回路。若路径中顶点没有重复出现,则称这条路径为简单路径。

在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图,否则,将其中的极大连通子图称为连通分量。

在有向图中,如果对于每一对顶点vi和vj,从vi到vj和从vj到vi都有路径,则称该图为强连通图;否则,将其中的极大连通子图称为强连通分量。

2.图的基本操作 (1)创建一个图结构 CreateGraph(G) (2)检索给定顶点 LocateVex(G,elem) (3)获取图中某个顶点 GetVex(G,v) (4)为图中顶点赋值 PutVex(G,v,value) (5)返回第一个邻接点 FirstAdjVex(G,v) (6)返回下一个邻接点 NextAdjVex(G,v,w) (7)插入一个顶点 InsertVex(G,v) (8)删除一个顶点 DeleteVex(G,v) (9)插入一条边 InsertEdge(G,v,w) (10)删除一条边 DeleteEdge(G,v,w) (11)遍历图 Traverse(G,v) 7.2 图的存储结构 7.2.1 邻接矩阵存储结构

1. 无向图的邻接矩阵 具有n个顶点的有向图可以用一个nⅹn的方形矩阵表示。假设该矩阵的名称为M,则当(vi,vj)是该有向图中的一条弧时,M[i,j]=1;否则M[i,j]=0。第i个顶点的出度为矩阵中第i行中"1"的个数;入度为第i列中"1"的个数,并且有向图弧的条数等于矩阵中"1"的个数。例如:如图7-2的邻接矩阵所示。

图 7-2 一个无向图及其邻接矩阵 2. 无向图的邻接矩阵 具有n个顶点的无向图也可以用一个nⅹn的方形矩阵表示。假设该矩阵的名称为M,则当是该无向图中的一条边时,M[i,j]=M[j,i]=1;否则,M[i,j]=M[j,j]=0。第i个顶点的度为矩阵中第i 行中"1"的个数或第i列中"1"的个数。图中边的数目等于矩阵中"1"的个数的一半,这是因为每条边在矩阵中描述了两次。

图7-3 一个有向图及其邻接矩阵 3.邻接矩阵存储结构定义 在C 语言中,实现邻接矩阵表示法的类型定义如下所示: #define MAX_VERTEX_NUM 20 typedef struct graph{ Elemtype elem[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int n; } Graph; 7.2.2 邻接表存储结构 1. 邻接表结构 边结点的结构定义是 adjvex是该边或弧依附的顶点在数组中的下标,next是指向下一条边或弧结点的指针。如图7-4

图 7-4 图7-2的邻接表 其中elme是顶点内容,firstedge是指向第一条边或弧结点的指针。 2.邻接表结构定义 在C语言中,实现邻接表表示法的类型定义如下所示: #define MAX_VERTEX_NUM 30 //最大顶点个数 type struct EdgeLinklist{ //边结点 int adjvex; struct EdgeLinklist *next; } EdgeLinklist; typedef struct VexLinklist{ //顶点结点 Elemtype elem; EdgeLinklist *firstedge; } VexLinklist,AdjList[MAX_VERTEX_NUM];

7.2.3 有向图和无向图邻接表的创建算法 1. 创建有向图邻接表 void Create_adj(AdjList adj, int n) { for (i=0;i scanf(&adj[i].elem); adj[i].firstedge=NULL; } scanf(&i,&j); //输入弧 while (i) { s=(EdgeLinklist*)malloc(sizeof(EdgeLinklist)); //创建新的弧结点

s->adgvex=j-1; s->next=adj[i-1].firstedge; //将新的弧结点插入到相应的位置

adj[i-1].firstegde=s; scanf(&i,&j); //输入下一条弧 } } 2.创建无向图的邻接表 void Create_adj(AdjList adj, int n) { for (i=0;i scanf(&adj[i].elem); adj[i].firstedge=NULL; } scanf(&i,&j); //输入边 while (i) { s1=(EdgeLinklist*)malloc(sizeof(EdgeLinklist)); s1->adgvex=j-1;

s2=(EdgeLinklist*)malloc(sizeof(EdgeLinklist)); s2->adgvex=i-1; s1->next=adj[i-1].firstedge; adj[i-1].firstegde=s1; s2->next=adj[j-1].firstedge; adj[j-1].firstegde=s2; scanf(&i,&j); } }

7.3 图的遍历 常见的图遍历方式有两种:深度优先遍历和广度优先遍历,这两种遍历方式对有向图和无向图均适用。

7.3.1 深度优先遍历 1.算法思想 深度优先遍历的基本思想类似于树的先序遍历。其遍历过程可以描述为:从图中某个顶点v出发,访问该顶点,然后依次从v的未被访问的邻接点出发继续深度优先遍历图中的其余顶点,直至图中所有与v有路径相通的顶点都被访问完为止。

2.算法实现。 为了便于在算法中区分顶点是否已被访问过,需要创建一个一维数组visited[0..n-1](n是图中顶点的数目),用来设置访问标志,其初始值visited[i](0≤i≤n-1)为"0",表示邻接表中下标值为i的顶点没有被访问过,一旦该顶点被访问,将visited[i]置成"1"。

int visited[0..n-1]={0,0,...0}; void DFS(AdjList adj,int v) { //v是遍历起始点的在邻接表中的下标值,其下标从0开始 visited[v]=1; visite(adj[v].elem); for (w=adj[v].firstedge;w;w=w->next) if (!visited[w->adjvex]) DFS(adj,w->adjvex); } 对于无向图,这个算法可以遍历到v顶点所在的连通分量中的所有顶点,而与v顶点不在一个连通分量中的所有顶点遍历不到;而对于有向图可以遍历到起始顶点v能够到达的所有顶点。若希望遍历到图中的所有顶点,就需要在上述深度优先遍历算法的基础上,增加对每个顶点访问状态的检测:

int visited[0..n-1]={0,0,...0}; void DFSTraverse(AdjList adj) { for (v=0;v } 7.3.2 广度优先遍历 1.算法思想 对图的广度优先遍历方法描述为:从图中某个顶点v出发,在访问该顶点v之后,依次访问v的所有未被访问过的邻接点,然后再访问每个邻接点的邻接

相关文档
最新文档