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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计图的遍历.docx

1、数据结构课程设计图的遍历数据结构课程设计-图的遍历内蒙古科技大学本科生课程设计论文题 目:图的遍历2013年07月05日内蒙古科技大学课程设计任务书课程名称数据结构课程设计设计题目图的遍历指导教师时间2013.6.242013.7.5一、教学要求1. 掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风二、设计资料及参数每个学生在教师提供的课程设计题目中

2、任意选择一题,独立完成,题目选定后不可更换。图的遍历:以数组表示法或邻接表表示图,在此基础上实现对图的遍历。要求设计类(或类模板)来描述图,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:v输入图、输出图v求图中顶点V的第一个邻接点v求图中顶点V的下一个邻接点v深度优先遍历图v广度优先遍历图 并设计主函数测试该类(或类模板)。三、设计要求及成果1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告四、进度安排资料查阅与讨论(1天)系统分析(2天)系统的开发与测试(5天)编

3、写课程设计说明书和验收(2天)五、评分标准1. 根据平时上机考勤、表现和进度,教师将每天点名和检查2. 根据课程设计完成情况,必须有可运行的软件。3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问六、建议参考资料1数据结构(C语言版)严蔚敏、吴伟民主编清华大学出版社 2004.112数据结构课程设计案例精编(用C/C+描述),李建学 等 编著,清华大学出版社 2007.23.数据结构:用面向对象方法与C+语言描述,殷人昆主编,清华大学出版社 2007.6第一章图的遍历原理1.1总述图的

4、遍历:从图中某一顶点出发访遍图中其余顶点,且使得每一个顶点仅被访问一次。这一过程就叫做图的遍历。1.2深度优先遍历深度优先遍历类似于树的先根遍历,是树的先根遍历的推广。假如初始状态是图中所有顶点未曾被访问,则深度优先遍历可从图中某个顶点V出发,访问此顶点,然后依次从V的未被访问的邻接点出发深度优先遍历图,直到图中所有和V有路径相通的顶点都被访问到;若图中此时尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直到图中所有顶点都被访问到为止。以图1.1为例,假如从顶点V1出发进行搜索,在访问了顶点V1之后,选择邻接点V2。因为V2未曾访问,则从V2出发进行搜索。以此类推,接着

5、从V4,V8,V5出发进行搜索。在访问了V5之后,由于V5的邻接点都已被访问,则搜索回到V8。由于同样的理由,搜索回到V4,V2直到V1,此时由于V1的另一个邻接点未被访问,则搜索又从V1到V3,再继续进行下去。由此,得到的顶点访问序列为:V1V2V4V8V5V3V6V71.3广度优先遍历广度优先遍历类似于树的按层次遍历的过程。假如从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问的顶点的邻接点都被访问到。若图中此时尚有顶点未被访问,则另选图

6、中一个未曾被访问的顶点作起始点,重复上述过程,直到图中所有顶点都被访问到为止。以图1.1为例,首先访问V1和V1的邻接点V2和V3,然后依次访问V2的邻接点V4和V5及V3的邻接点V6和V7,最后访问V4的邻接点V8。由于这些顶点的邻接点均已被访问,并且图中所有顶点都被访问,由此完成图的遍历。得到的顶点访问序列为:V1V2V3V4V5V6V7V8第二章需求分析要求设计类(或类模板)来描述图,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:v输入图、输出图v求图中顶点V的第一个邻接点v求图中顶点V的下一个邻接点v深度优先遍历图v广度优先遍历图并设计主函数测试该类(或类模板)。第

7、三章 总体设计3.1程序设计思路本系统有六个基本功能:输入图,输出图,求图中顶点V的第一个邻接点,求图中顶点V的下一个邻接点,深度优先遍历图,广度优先遍历图。输入图:首先需输入顶点数及边数,然后根据顶点数确定矩阵大小,再根据边数输入对应的两点及权值。输出图:先输出有所有边及对应的权值,再输出矩阵。求图中顶点V的第一个邻接点:通过输入顶点v就可以输出其第一个邻接点。求图中顶点V的下一个邻接点:通过输入顶点v及另一点,就可以从该位置的下一个位置开始,找到顶点V的下一个邻接点。深度优先遍历图:由1.1所述可知,图的深度优先遍历显然是一个递归的过程。为了在遍历过程中便于区分顶点是否被访问过,需要附设一

8、个访问标志数组,其初始值为false,一旦某个顶点被访问,则将其相应的分量置为true。广度优先遍历图:由1.2所述可知,和深度优先遍历类似,在广度优先遍历的过程中也需要一个访问标志数组。并且为了顺次访问路径长度为2,3,的顶点,需要附设队列以存储已被访问的路径长度为1,2,的顶点。3.2 功能视图本程序主要包含六个功能,即图的创建,输出,访问顶点V的第一个和下一个邻接点,以及深搜和广搜。其功能视图如图2.1所示。图3.1功能视图第四章 类的设计4.1 GraphUDN类的设计GraphUDN类包括:1.私有的数据成员,其中有顶点访问标志,顶点集,邻接矩阵,顶点数就边数 2.公有的成员函数,其

9、中有创建输出图,输出顶点V的第一个和下一个邻接点,以及深搜和广搜。具体见以下程序段:classGraphUDN public: GraphUDN (); void create(); /创建图void showGraph(); /输出图 intfirstAdjvex(int v); /输出v的第一个邻接顶点 intnextAdjvex(int v, int w); /输出下一个邻接顶点 void dfsTravel(); /深度优先遍历 voiddfs(int v); void bfsTravel(); /广度优先遍历private: bool visitedMAX_VERTEX_NUM; /

10、顶点访问标志 int vexsMAX_VERTEX_NUM; /顶点集 int arcsMAX_VERTEX_NUMMAX_VERTEX_NUM; /邻接矩阵 intvexNum; intarcNum;4.2 Queue类的设计Queue类作为一个辅助的功能类,主要包括入队,出队及队列的判空。具体如下:class Queue public: Queue () for(inti = 0; i MAX_VERTEX_NUM; i+) quesi = -1; ; void add(intele); /入队 int get(); /出队 boolisEmpty(); /判断队列是否为空private:

11、 intquesMAX_VERTEX_NUM;第五章 详细设计5.1 工程视图和类视图本程序运行时的工程视图及类视图如图5.1,5.2所示。图5.1 工程视图 图5.2 类视图5.2主要算法的流程图5.2.1 主函数的流程图本程序的主函数中,首先定义及初始化所需变量,实例化对象,然后输出菜单界面供用户选择,通过switch函数实现选择功能,选择项目包括创建无向图,输出无向图,输出顶点V的第一个邻接点,输出顶点V的下一个邻接点,深搜,广搜以及退出。具体如图4.3所示。图 5.3主函数流程图5.2.2 深搜流程图深度优先遍历图的过程实质上是对每个顶点查找其邻接点的过程,具体如图5.4所示:图 5.

12、4深度优先算法遍历流程图5.2.3 广搜流程图广度优先遍历的过程实质上就是通过边找邻接点的过程,具体如图5.5所示:图 5.5广度优先算法遍历流程图第六章 测试6.1 菜单界面当运行程序后,首先出现菜单界面,包括程序提供的六个功能,用户通过选择功能前的数字,即可实现相应的功能。具体如图6.1所示。图6.1 菜单界面6.2 创建无向网接下来应当创建一个图,通过输入顶点数,边数,邻接点及权值即可实现。在本次测试中,建立的是一个8个顶点,9条边的且所有边的权值均为1的无向网。输入如图6.2所示图6.2 创建图6.3 输出图当输入图以后,实际图是以邻接矩阵的形式存在的,所以输出图的时候输出的就是邻接矩

13、阵,为方便理解,还输出了邻接点及对应边的权值。输出结果如图6.3所示。图6.3 输出图6.4 输出顶点V的第一个邻接点实际上输出顶点V的第一个邻接点并无太大的意义,因为这个函数主要是为了实现深搜和广搜功能而编写的,但在此处,为了更加便于普通用户理解此程序,特意添加了此操作,具体操作及结果如图6.4所示。图6.4 输出V的第一个邻接点6.5 输出顶点V的下一个邻接点如同6.4节所述,输出顶点V的下一个邻接点也并无太大意义,同样是为了便于普通用户理解,具体操作及结果如图6.5所示。图6.5 输出V的下一个邻接点6.6 深搜深度优先遍历图相当于树的先序遍历,具体原理见 所述,针对本次测试所创建的图,

14、它的深度优先遍历结果如图6.6所示。图6.6 深度优先搜索6.7 广搜广度优先遍历图相当于树的层次遍历,具体原理见 所述,针对本次测试所创建的图,它的广度优先遍历结果如图6.7所示。图6.7 广度优先搜索第七章 总结转眼之间,为期两周的课程设计就结束了,通过这两个星期的课程设计,我发现了自己很多不足的地方,知识点也存在很多漏洞,还接触了一些以前没有了解的东西,让我明白了基础知识的重要性,以及实践能力的重要性!因为基础知识的不扎实让我在这次课程设计中走了许多弯路,不过我认为是值得的,至少它让我明白了,付出与回报是成正比的。 这次的课程设计,可以说是有苦有甜。苦的是,由于学习数据结构课程的时候,并

15、没有过多的涉及文件操作的知识,所以到课程设计的时候,我不得不通过看书,问同学老师以及上网查询来了解关于文件操作的知识点。甜的是,在程序设计过程中,不仅检验、巩固了我以前所学的知识,也让我如何去把握一件事情,如何去做一件事情,又如何完成一件事情,当看到自己亲自设计,调试好的程序运行的时候,心里有一种说不出的自豪感和成就感。“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义。课程设计是培养我们综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。 它为我们提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识

16、和实际有机的结合起来,锻炼我们的分析解决实际问题的能力。提高我们运用所学知识解决实际问题的能力。课程设计这类实践训练是我们迈向社会,从事职业工作前一个必不少的过程。所以通过这次的课程设计,也让我对自己的职业工作有了进一步的了解。通过这次图的遍历的设计,我在多方面都有所提高。首先,整体与局部的把握,在系统设计前,需要整体思考图的遍历所包含的信息及其实现的功能,在设计过程中,再思考局部功能实现的完整性与整个程序的结合。其次,在实现信息储存这个功能时,通过查阅课本、资料,实践,对文件操作有了更深的了解,能够熟练运用I/O流,而且加强了对类中函数成员使用等知识,并通过条件以及循环语句实现不同的操作。课

17、程设计使我对数据结构课程又进行了系统的复习,独立思考的能力也有了提高。在程序设计运行过程中遇到错误,就通过与同学讨论、研究,集思广益,更改代码,不断的尝试实践运行各种方法虽然在这个过程中遇到了很多问题,但程序编辑成功后那种激动,使我深深地体会到了学习的快乐和团结的力量,也让我真正学习到了一些的知识,使我感到未来是充满挑战与趣味的。通过这次编程使我认识到在以后的学习中要多做练习增加自己的知识面才能更好的适应自己的工作,不管遇到什么,都要充满信心地去解决问题。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能

18、真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。而且这次课程设计也让我受益匪浅,真切感觉到任何事情都需要细心和耐心,二者缺一不可。没有细心,做事情永远都是事倍功半,一旦某个细节错了,就会导致某个部分应用不了额,甚至可能导致整个系统都运行不了。没了耐心,可能就会导致这件事不能够完成,经常半途而废。当然,任何一件事的顺利完成都不是靠一个人就可以的,在此感谢丁雨老师对我细心的指导,同时也非常感谢给予我帮助的同学们,谢谢你们。总而言之,这次课程设计不仅让我学到了关于数据结构的更多的知识,也让我明白了要完成一件事情所需要的精神。附录:程序代码#include #define MAX_VERT

19、EX_NUM 20/-队列-class Queue public: Queue () for(int i = 0; i MAX_VERTEX_NUM; i+) quesi = -1; ; void add(int ele); /入队 int get(); /出队 bool isEmpty(); /判断队列是否为空private: int quesMAX_VERTEX_NUM;void Queue:add(int ele) for(int i = 0; i MAX_VERTEX_NUM; i+) if(quesi = -1) quesi = ele; break; int Queue:get()

20、 int ele = ques0; for(int i = 0; i MAX_VERTEX_NUM; i+) int t; t = quesi; quesi = quesi + 1; quesi + 1 = t; return ele;bool Queue:isEmpty() if(ques0 != -1) return false; else return true; /-队列类结束-/输出顶点void visite(int vl) vl = vl + 1; coutvl; return;/-无向网类-class GraphUDN public: GraphUDN (); void crea

21、te(); /创建图 void showGraph(); /输出图 int firstAdjvex(int v); /输出v的第一个邻接顶点 int nextAdjvex(int v, int w); /输出下一个邻接顶点 void dfsTravel(); /深度优先遍历 void dfs(int v); void bfsTravel(); /广度优先遍历private: bool visitedMAX_VERTEX_NUM; /顶点访问标志 int vexsMAX_VERTEX_NUM; /顶点集 int arcsMAX_VERTEX_NUMMAX_VERTEX_NUM; /邻接矩阵 in

22、t vexNum; int arcNum;GraphUDN:GraphUDN()void GraphUDN:create() cout请输入顶点数,以及边数vexNumarcNum; /构造顶点向量 for (int p = 0; p vexNum; p+) visitedp = false; vexsp = p + 1; /初始化邻接矩阵 for (int i = 0; i vexNum; i+) for (int j = 0; j vexNum; j+) arcsij = 0; /构造邻接矩阵 int v1,v2,w; for (int k = 0; k arcNum; k+) coutv

23、1v2w; int i,j; i = v1-1; j = v2-1; arcsij = w; arcsji = arcsij; void GraphUDN:showGraph() for (int i = 0; i vexNum; i+) for (int j = i; j vexNum; j+) if (arcsij != 0) coutvexsi -(arcsij vexsj endl; cout邻接矩阵:endl; for (int k = 0; k vexNum; k+) for (int p = 0; p vexNum; p+) coutarcskp ; coutendl; int

24、GraphUDN:firstAdjvex(int v) for(int i = 0; i vexNum; i+) if(arcsvi != 0) return i; return -1;int GraphUDN:nextAdjvex(int v, int w) for(int i = w+1; i vexNum; i+) if(arcsvi!=0 & visitedi=false) return i; return -1; void GraphUDN:dfsTravel() int i; for(i=0; i vexNum; i+) visitedi = false; for(i=0; i v

25、exNum; i+) /从0开始 if(visitedi = false) dfs(i); cout结束endl; void GraphUDN:dfs(int v) int w; visitedv = true; visite(v); for(w = firstAdjvex(v); w != -1; w = nextAdjvex(v,w) if(visitedw=false) dfs(w); void GraphUDN:bfsTravel() for (int i = 0; i vexNum; i+) visitedi = false; Queue que; for (i = 0; i =0;

26、 w=nextAdjvex(u, w) if (visitedw = false) visitedw = true; visite(w); que.add(w); cout结束endl;/-/主函数void main() bool flat = true; int select; int vex,w,result; GraphUDN grap; while (flat) cout-endl; cout 1、创建无向图;endl; cout 2、输出无向图;endl; cout 3、输出顶点v的第一个邻接顶点;endl; cout 4、输出顶点v的下一个邻接顶点;endl; cout 5、深度优先遍历图;endl; cout 6、广度优先遍历图;endl; cout 7、退出。endl; cout 请输入操作:endl; cout-select; switch (select) case 1: grap.create(); break; case 2: grap.showGraph(); break; case 3: coutvex; coutv的第一个邻接顶点:grap.firstAd

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

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