收藏 分享(赏)

数据结构第七章课后习题答案.doc

上传人:hskm5268 文档编号:6359124 上传时间:2019-04-09 格式:DOC 页数:10 大小:87.07KB
下载 相关 举报
数据结构第七章课后习题答案.doc_第1页
第1页 / 共10页
数据结构第七章课后习题答案.doc_第2页
第2页 / 共10页
数据结构第七章课后习题答案.doc_第3页
第3页 / 共10页
数据结构第七章课后习题答案.doc_第4页
第4页 / 共10页
数据结构第七章课后习题答案.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、数据结构17_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、 出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点 1 出发,按广度优先法搜索法遍历图时所得到的顶点序列。(1)DFS 法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型 L_NODE 规定,而各个链表的头指针存放在数组 head 中。数组 e 中的元素 e0,e1,em-1给出图中的 m 条边,e 中结点形式由类型 E_NODE 规定。visiti数组用来表示顶点 i 是否被访问过。遍历前置 visit 各元素为 0,若顶点 i 被访问过,则置 visiti为 1.算法分析:首先访问出发顶点 v.接着,选择一个与 v 相邻接且未被访问过的的顶点 w 访问

3、之,再从w 开始进行深度优先搜索。每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点 u,并从 u 开始进行深度优先搜数据结构2索。这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。另一方面,先建立一个相应的具有 n 个顶点,m 条边的无向图的邻接表。初始化 visit 数组,使其各个元素置为 0,表示图中每个顶点都没被访问过。下面给出程序:#include#define MAXN 50#define MAXM 100typedef struct l_nodeint ve

4、r;struct l_node *link;L_NODE;typedef struct e_nodeint ver1;int ver2;E_NODE;void creat_adj_list(L_NODE *head,int n,E_NODE e,int m)int i,u,v;L_NODE *p,*q;for(i=1;iver=v;p-link=NULL;if(headu=NULL) headu=p;else q=headu;while(q-link!=NULL) q=q-link;q-link=p;p=(L_NODE*)malloc(sizeof(L_NODE);p-ver=u;p-link

5、=NULL;if(headv=NULL) headv=p;else q=headv;while(q-link!=NULL) q=q-link;q-link=p;void init(int visit,int n)int i;for(i=1;iver=0) dfs(t-ver,head,visit);t=t-link;测试报告:void main()L_NODE *headMAXN;int visitMAXN,n,m,u;E_NODE e12;e0.ver1=1;e0.ver2=3;e1.ver1=1;e1.ver2=4;e2.ver1=1;e2.ver2=2;e3.ver1=2;e3.ver2

6、=4;e4.ver1=2;e4.ver2=5;e5.ver1=3;e5.ver2=6;e6.ver1=3;e6.ver2=4;e7.ver1=4;e7.ver2=6;e8.ver1=4;e8.ver2=7;e9.ver1=4;e9.ver2=5;e10.ver1=5;e10.ver2=7;e11.ver1=6;e11.ver2=7;creat_adj_list(head,7,e,12);init(visit,7);dfs(head,visit,1);printf(“n“);输出结果:1 3 6 4 2 5 7(1) BFS 法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点

7、形式由类型 L_NODE 规定,而各个链表的头指针存放在数组 head 中。数组 e 中的元素 e0,e1,em-1给出图中的 m 条边,e 中结点形式由类型 E_NODE 规定。visiti数组用来表示顶点 i 是否被访问过。遍历前置 visit 各元素为 0,若顶点 i 被访问过,则置 visiti为 1.另外,使用一个队列 QTYPE 来存储已经访问过的顶点。算发分析:首先访问出发顶点 v,然后访问与顶点 v 邻接的全部顶点 w1,w2,wi,再依次访问与数据结构4w1,w2,wi,邻接的全部顶点(已访问的顶点除外) ,再从这些已访问的顶点出发,依次与它们邻接的全部顶点(已访问的顶点除外

8、) 。依次类推,直到图中或 v 所在的连通分量的所有顶点都被访问到为止,广度优先搜索结束。下面给出程序:#include#define MAXN 50#define MAXM 100typedef struct l_nodeint ver;struct l_node *link;L_NODE;typedef struct e_nodeint ver1;int ver2;E_NODE;void creat_adj_list(L_NODE *head,int n,E_NODE e,int m)int i,u,v;L_NODE *p,*q;for(i=1;iver=v;p-link=NULL;if(

9、headu=NULL) headu=p;else q=headu;while(q-link!=NULL) q=q-link;q-link=p;p=(L_NODE*)malloc(sizeof(L_NODE);p-ver=u;p-link=NULL;if(headv=NULL) headv=p;else q=headv;while(q-link!=NULL) q=q-link;q-link=p;void init(int visit,int n)int i;for(i=1;iver;if(visitw=0)printf(“%4d“,w);visitw=1;queue.item+queue.qe=

10、w;t=t-link;测试报告:void main()L_NODE *headMAXN;int visitMAXN,n,m,u;E_NODE e12;e0.ver1=1;e0.ver2=3;e1.ver1=1;e1.ver2=4;e2.ver1=1;e2.ver2=2;e3.ver1=2;e3.ver2=4;e4.ver1=2;e4.ver2=5;e5.ver1=3;e5.ver2=6;e6.ver1=3;e6.ver2=4;e7.ver1=4;e7.ver2=6;e8.ver1=4;e8.ver2=7;e9.ver1=4;e9.ver2=5;e10.ver1=5;e10.ver2=7;e11

11、.ver1=6;e11.ver2=7;creat_adj_list(head,7,e,12);数据结构6init(visit,7);bfs(1,head,visit);printf(“n“);输出结果:1 3 4 2 6 7 57_3 对于图题 7.3 的有向图,给出:(1) 表示该图的邻接矩阵。(2) 表示该图的邻接表。(3) 图中每个顶点的入度和出度。解:(1) 邻接矩阵如下:0 1 0 1 0 0 0 图题 7.30 0 0 0 1 0 01 0 0 0 0 0 00 0 0 0 1 1 00 0 0 0 0 0 10 0 1 0 0 0 00 0 0 0 0 1 0(2) 邻接表如下:

12、 123455 1 57 3 6 6 2 4 6 73 51 24数据结构767(4) 设各顶点入度和出度分别为 ri,ci:r1=1,c1=2r2=1,c2=1r3=1,c3=1r4=1,c4=2r5=2,c5=1r6=2,c6=1r7=1,c7=17_4对于图题 7.3 的有向图,给出:(1) 从顶点 1 出发,按深度优先搜索法遍历图时的所得的顶点序列。(2) 从顶点 1 出发,按广度优先搜索法遍历图时的所得的定点序列。解:(1) 1257634(2) 12456737_5 对于图题 7.1 的无向图,试问它是(1)连通图吗?(2)完全图吗?1 23 4 56 7(1) 该图是连通图。判断

13、无向图是否为连通图,即判断该图中是否每对顶点之间都有路径。(2) 该图不是完全图。判断无向图是否为完全图,即判断图中是否每对顶点之间都有边。7_6对于图题 7.3 的有向图,试问它是(1)弱连通图吗?(2)强连通图吗?1 2数据结构83 4 56 7(1)该图是弱连通图。判断有向图是否为弱连通图,即需判断图中是否每对顶点 v 和 w 之间有一个由不同顶点组成的顶点序列(v0,v1,vk) ,其中 v0=v,vk=w,且(vi,vi+1)或(vi+1,vi)属于图的边集。(2)该图是强连通图。判断有向图是否为强连通图,即需判断图中是否每对顶点之间有一条路径。7_7图题 7-7 是有向图,试问其中

14、哪个图是(1) 弱连通的?(2) 强连通的?(a) (b)解(1)(b) 图是弱连通的。(2)( a) 图是强连通的。7_8具有 N 个顶点的连通无向图至少有几条边?解具有 N 个顶点的连通无向图至少应有 N1 条边。7_9具有 N 个顶点的强连通有向图至少有几条边? 2N 条边。7_10分别写出用深度和广度优先搜索法遍历具有六个顶点的完全无向图的顶点序列。 (假设都以顶点 1 出发) 。深度优先:1,2,3,4,5,6广度优先:1,2,3,4,5,61 243 4321数据结构97_11题目:改写以深度优先搜索法遍历给定的连通图的 dfs 程序,要求不用递归方法,而用一个栈来实现。算法分析:

15、用栈保存由结点 V 出发可到达的结点,并作上标记,以使下次遇到时不会重复输出。当一路结点访问完后,向前回溯(利用出栈)并访问其他结点,直到所有结点均已遍历。程序的流程:结点进栈结点出栈访问并标记结点 相联结点进栈 。 (相联结点进栈后,执行相同的步骤)当栈空时,遍历完成。程序:#define MAXN 50typedef struct nodeint data;struct node* link;void dfs(NODE *head,int ver,int v)int sMAXN,visitMAXN;int top,i;for(i=1;i=0)v=stop-;if(visitv=0)prin

16、tf(“%dt“,v);visitv=1;for(p=headv;p;p=p-link)if(visitp-data=0)s+top=p-data;printf(“n“);7_12数据结构10题目:在图题 7.1 中,从顶点 1 出发,分别画出其 dfs 生成树和 bfs 生成树。分析:根据 dfs 遍历和 bfs 遍历的顺序,记录所得到的点和边的集合,即可得到生成树和生成树。dfs 遍历:(1,2,4,3,6,7,5) ,边分别为:(1,2) , (2,4) , (4,3) , (3,6) ,(6,7) , (7,5) 。bfs 遍历:(1,2,3,4,5,6,7) ,边分别为:(1,2) , (1,3) , (1,4) , (2,5) ,(3,6) , (4,7) 。解答:dfs 生成树:bfs 生成树:63 4752163 4752163 47521

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报