ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:601.05KB ,
资源ID:8647716      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8647716.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(图的广度遍历课程设计报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

图的广度遍历课程设计报告.docx

1、图的广度遍历 课程设计报告目录1. 需求分析 31) 问题描述 32) 系统功能 32. 概要设计 41) 流程图 42) 结构体、函数及说明 43. 详细设计 61) 遍历函数设计 62) 容错性方法设计 73) 生成邻接表设计 74) 邻接表遍历设计 84. 调试分析和测试结果 91) 调试分析 92) 测试结果 9a) 测试案例 9b) 测试过程与截图 9i. 容错性测试 10ii. 无向图(案例一)测试 13iii. 有向图(案例二)测试 155. 总结 17参考文献 18附录 191. 需求分析1) 问题描述对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用队列的五种

2、基本运算(置空队列、进队、出队、取队头元素、判队空)实现图的广度优先搜索遍历。2) 系统功能首先输入图的类型,有向或无向图(因为遍历与权值无关,所以没有涉及带权图)。然后输入图的顶点数、边数和各条边,之后生成该图的邻接表并输出。再输入要遍历该图的起点,然后从所输入的点广度搜索该图的邻接表,并按遍历顺序输出顶点内容。之后决定是否继续遍历该图或输入另一个需要遍历的图亦或是结束程序。2. 概要设计1) 流程图 是 否 否 是2) 结构体、函数及说明typedef struct ArcNode/邻接表表结点 int adjvex;/该弧所指向的顶点位置 struct ArcNode *nextarc;

3、/指向下一条弧的指针 /InfoType *info;/该弧相关信息指针ArcNode;typedef struct VNode/邻接表头结点 VertexType data;/结点信息 ArcNode *firstarc;/指向第一条依附该结点的弧的指针VNode,AdjListMAX_VERTEX_NUM;typedef struct/图 AdjList Vertices;/邻接表头结点数组 int vexnum,arcnum;/图的当前顶点数和弧数 int kind;/图的种类标志(有向图:0,无向图:1)ALGraph;void print(int v)/输出顶点信息int First

4、AdjVex(ALGraph G,int u)/在邻接表G中取第u个头结点void NextAdjVex(ALGraph G,int u,int w)/ 在邻接表G中取第u个头结点之后的结点w的下一结点void BFSTraverse(ALGraph G,queue Q,bool visited,int m,int n,void (*Visit)(int)/使用辅助队列Q从邻接表结点m开始n结束广度遍历邻接表图G3. 详细设计1) 遍历函数设计void BFSTraverse(ALGraph G,queue Q,bool visited,int m,int n,void (*Visit)(in

5、t)/使用辅助队列Q从邻接表结点m开始n结束广度遍历邻接表图G /按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited。 while(!Q.empty() Q.pop();/置空的辅助队列Q for(int v=m;v= 0; w = NextAdjVex(G,u,w)/从以u为头结点的邻接表开始遍历到链表中的最后一个结点 if(!visitedw)/w为u的尚未访问的邻接结点 visitedw=true; Visit(w);/访问w Q.push(w);/w入队列 /if /while /if/BFSTraverse*/2) 容错性方法设计 coutn|t1)/如果整型不在合

6、理范围内 cout错误!请输入一个大于0小于n+1的数:;/程序报错并返回循环重新输入 else/如果整型在范围内 break;/跳出循环继续 G.arcnum=t;/赋值3) 生成邻接表设计 coutn请分别输入图的G.arcnum条弧(弧尾,弧头):endl; for(int i=0;iG.arcnum;i+) int n1,n2; for(;) cout弧i+1G.vexnum|tG.vexnum|n1|t=n) /如果整型不在合理范围内 cout错误!请分别输入两个大于0小于G.vexnum+1adjvex = n2;/结点赋值为n2 G.Verticesn1.firstarc-nex

7、tarc= NULL;/设置n2之后的结点为空 else/如果n1后已有结点 ArcNode *p = G.Verticesn1.firstarc;/新建结点指针 while(p-nextarc)!=NULL) p = p-nextarc;/将指针指向链表中最后一个结点 p-nextarc = new ArcNode;/在最后增加一个新结点 p-nextarc-adjvex = n2;/给结点赋值n2 p-nextarc-nextarc=NULL; /设置n2之后的结点为空 4) 邻接表遍历设计 coutG.vexnum|t1) /如果整型不在合理范围内 cout错误!请输入一个大于0小于G.

8、vexnum+1的数:; /程序报错并返回循环重新输入 else/如果整型在范围内 break; /跳出循环继续 t-=1;/赋值 coutn广度遍历顺序:n; queue Q;/定义辅助队列Q for(int j=0;jG.vexnum;+j) visitedj=false;/访问标志置0 BFSTraverse(G,Q,visited,t,G.vexnum,print);/从输入的遍历起点到最后一个邻接表头结点遍历邻接表 BFSTraverse(G,Q,visited,0,t,print);/从第一个邻接表头结点到输入的邻接表头结点遍历邻接表,防止还有连通分量尚未遍历4. 调试分析和测试结

9、果编译、运行及调试环境: Microsoft Visual Studio 2010 Ultimate1) 调试分析一在求图的第u个顶点,与其相邻的一系列顶点中,第w个顶点的下一个顶点时,若是求最后一个顶点的下一个顶点时,因为是空指针所以返回值为0,程序误以为是第一个顶点,再求下一个顶点时便报错。原因是判断条件没有写好,于是增加判断,当指针为空时返回-1。修改判断条件后,函数正常运行。二在输入图信息的时候,若输入非法字符,程序会异常终止。例如程序要求输入一个整型,用户却输入了一个字母,这时候会出现异常。只是程序是否健壮性的一个体现。先用字符串接收字符,转换成整型后再判断是否符合要求。如果不符合便

10、提示用户按要求重新输入。还有其他一些类似的输入异常,都是采用类似的处理方法。三作为一个完整的程序,友好的界面是必须的。因次程序中适当地采用系统中的清屏命令,使得界面更加简洁,明了。2) 测试结果a) 测试案例:案例一 案例二b) 测试过程与截图:i. 容错性测试:在输入字母、符号、或不符合要求的数字时,提示错误并要求重新正确输入。(截图1.1截图1.7)截图1.1截图1.2截图1.3截图1.4截图1.5截图1.6截图1.7ii. 无向图(案例一)测试:将测试案例一的数据输入程序,从第一个顶点开始遍历,结果如截图2.1所示。截图2.1输入y表示要继续遍历该图后,程序清屏,再次打印邻接表,并要求再

11、次输入遍历起点,如截图2.2所示。截图2.2输入2后,打印从第二个顶点遍历的顺序,输入n停止继续遍历该图,如截图2.3所示。截图2.3iii. 有向图(案例二)测试:输入y表示继续输入其他图进行遍历后,程序清屏,并要求再次输入一个图,将测试案例2的数据输入程序后,从第一个顶点遍历,如截图3.1所示。截图3.1输入y表示要继续遍历该图后,程序清屏,再次打印邻接表,并要求再次输入遍历起点。输入4后,打印从第四个顶点遍历的顺序,输入n停止继续遍历该图。再次输入n停止继续输入其他图进行遍历,程序结束,如截图3.2所示。截图3.25. 总结通过这一个课程设计,使我对图的广度优先遍历算法有了深度的了解。在

12、编程过程中也遇到了一些问题,基本上都一一解决了。但是由于能力有限,程序中还有一些尚未解决的问题。例如,如何能完全解决输入异常。这说明今后还需要继续努力。参考文献a. 图书类的参考文献1. 谭浩强C语言程序设计(第2版)清华大学出版社,出版年:2009引用部分起止页码:50-51,248-258。2. 陈维兴,林小茶C+面向对象程序设计教程(第3版)清华大学出版社,出版年:2009引用部分起止页码:260-273。3. 严蔚敏,吴伟民数据结构(C语言版)清华大学出版社,出版年:2010引用部分起止页码:156-170。4. 梁旭,谷晓琳,黄明C语言课程设计(第2版)电子工业出版社,出版年:200

13、9引用部分起止页码:21-24。b. 翻译图书类的参考文献1. 埃克尔 著C+编程思想刘宗田等 译(第2版)机械工业出版社,出版年:2003。c. 网站的名称谷歌:www.GXX:附录程序源码:/题目十一图的广度遍历/问题描述:对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,/然后利用队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)实现图的广度优先搜索遍历。#include #include #define MAX_VERTEX_NUM 101#define VertexType intusing namespace std;typedef struct ArcNode

14、/邻接表表顶点 int adjvex;/该弧所指向的顶点位置 struct ArcNode *nextarc;/指向下一条弧的指针 /InfoType *info;/该弧相关信息指针ArcNode;typedef struct VNode/邻接表头顶点 VertexType data;/顶点信息 ArcNode *firstarc;/指向第一条依附该顶点的弧的指针VNode,AdjListMAX_VERTEX_NUM;typedef struct/图 AdjList Vertices;/邻接表头顶点数组 int vexnum,arcnum;/图的当前顶点数和弧数 int kind;/图的种类标

15、志(有向图:0,无向图:1)ALGraph;void print(int v)/输出顶点信息 coutv+1adjvex;int NextAdjVex(ALGraph G,int u,int w)/ 在邻接表G中取第u个头顶点之后的顶点w的下一顶点 ArcNode *p = G.Verticesu.firstarc; while(w != p-adjvex) p = p-nextarc; if(p-nextarc=NULL)return -1; return p-nextarc-adjvex;void BFSTraverse(ALGraph G,queue Q,bool visited,int

16、 m,int n,void (*Visit)(int)/使用辅助队列Q从邻接表顶点m开始n结束广度遍历邻接表图G /按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited。 while(!Q.empty() Q.pop();/置空的辅助队列Q for(int v=m;v= 0; w = NextAdjVex(G,u,w) if(!visitedw)/w为u的尚未访问的邻接顶点 visitedw=true; Visit(w); Q.push(w); /if /while /if/BFSTraverse*/int main() int t,n; char s10,c10; ALGra

17、ph G; do system(cls); cout请输入图的类型(有向图输1,无向图输2):; for(;) gets_s(s); t=atoi(s); if(t!=1&t!=2) cout错误!请输入半角数字1或2:; else break; G.kind=t; cout99|t1) cout错误!请输入一个大于0小于100的数:; else break; G.vexnum=t; bool visitedMAX_VERTEX_NUM; for(int i=0;iG.vexnum;i+) visitedi=false; G.Verticesi.firstarc=NULL; if(G.kind

18、=1) coutn|t1) cout错误!请输入一个大于0小于n+1的数:; else break; G.arcnum=t; coutn请分别输入图的G.arcnum条弧(弧尾,弧头):endl; for(int i=0;iG.arcnum;i+) int n1,n2; for(;) cout弧i+1G.vexnum|tG.vexnum|n1|t=n) cout错误!请分别输入两个大于0小于G.vexnum+1adjvex = n2; G.Verticesn1.firstarc-nextarc= NULL; else ArcNode *p = G.Verticesn1.firstarc; wh

19、ile(p-nextarc)!=NULL) p = p-nextarc; p-nextarc = new ArcNode; p-nextarc-adjvex = n2; p-nextarc-nextarc=NULL; else coutn|t1) cout错误!请输入一个大于0小于n+1的数:; else break; G.arcnum=t; coutn请分别输入图的G.arcnum条边(顶点1,顶点2):endl; for(int i=0;iG.arcnum;i+) int n1,n2; for(;) cout边i+1G.vexnum|tG.vexnum|n1|t=n) cout错误!请分别

20、输入两个大于0小于G.vexnum+1adjvex = n2; G.Verticesn1.firstarc-nextarc= NULL; else ArcNode *p = G.Verticesn1.firstarc; while(p-nextarc)!=NULL) p = p-nextarc; p-nextarc = new ArcNode; p-nextarc-adjvex = n2; p-nextarc-nextarc=NULL; if(!visitedn2) visitedn2=true; G.Verticesn2.firstarc = new ArcNode; G.Verticesn2.firstarc-adjvex = n1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1