1、图的遍历实现课程设计 数据结构 程序 图 图的遍历实现课程设计-数据结 图-程序-构 数据结构课程设计 设计说明书 图的遍历的实现 学生姓名 英 茜 1118064033 学 号 级 班 网络1101班 绩 成 教导指师 静申 数学与计算机科学学院 2014年1 月 4日 课程设计任务书 2014学年第一学期2013课程设 数据结构课程设计 计名称:课程设 图的遍历实现 计题目:自 2013年 12 月23日至 2014 完成年 1 月 4 期 限: 日共 2 周 设计内容: 1. 任务说明 (1) 采用邻接表存储结构创建一个图; (2) 编程实现图的深度优先搜索(或广度优先搜索)遍历算法;
2、(3) 输出遍历结果; (4) 给定具体数据调试程序。 2. 要求 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么? 2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。 5)程序调试与测试:采用自底向上,分模块进行, 即先调试低层函数。 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析; 7)编写课程设计报告。 3. 参考资料 指导教师:申静
3、教研室负责人:余冬梅课程设计评阅评语指导教师签名 摘 要 针对图问题中如何更好地实现图的遍历问题,以无向图为例,分别采用广度优先遍历和深度优先遍历的算法实现对各节点的遍历,以VC+为开发环境进行系统的设计和实现,其运行结果表明,系统能很好地完成遍历后节点的输出,实现了遍历的目的,系统界面友好,可操作性强。 关键词:数据结构;存储结构;邻接矩阵 一 课题描述 . 1 二 . 设计目的与任务 2 2.1课程设计的目的 . 2 2.2课程设计的任务 . 2 三 . 设计方案和实施 4 3.1总体设计 . 4 3.2基本操作 . 4 3.3详细设计 . 6 四 运行调试结果 . 9 五 结论与致谢 .
4、 9 六 . 附录 11 一 课题描述 数据结构是一门专业基础课,它对学习者的要求很明确:学会分析、研究计算机加工的数据结构的特性,以便为应用设计所需的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。其次,该课程的学习过程也是复杂程序设计的训练过程,要求学习者编写的程序结构或设计的程序结构体清楚、正确、易读,符合软件工程的规范。 图是一种较为复杂且重要的数据结构,其特殊性在于图形结构中结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。就本课程设计而言应用图论的知识讨论如何在计算机上实现图的遍历的操作,主要解决图的遍历的几种方法的实现。
5、本设计采用目前最通用的程序设计语言之一C语言作为数据结构和算法的描述语言。 1 二 设计目的与任务 2.1课程设计的目的 进一步的了解图的遍历的问题,图的DFS,BFS的递归和非递归算法的实现, 用无向图来实现图的遍历。 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。 训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题。 训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。 提高综合运用所学的理论知识和方法独立分析和解决问题的能力。 2.
6、2课程设计的任务 1)任务说明 用C/C+编写一个程序实现图的遍历的算法。 从键盘上输入一个图的基本信息(图用邻矩阵表示)。用有向图实现图的遍历;;DFS,BFS的递归和非递归算法的实现图的用无向图实现图的遍历;用邻接矩阵存储图;用邻接表存储图。 2)要求 1首先输入图的结点数; 2依次输入图的各条边(数据之间用空格隔开); 3输出的形式:按用户选择的遍历方法给出遍历顺序,各字符间用-分隔; 2 4程序所能达到的功能:能够按要求输出所要的结果。 3 三 设计方案和实施 3.1总体设计 采用邻接矩阵作为图的存储结构。程序中主要用到以下抽象数据类型: 抽象数据类型的定义 typedef struc
7、t char *vexs; /顶点向量 int arcsMAX_VEXMAX_VEX; /邻接矩阵 int vexnum,arcnum; /图的当前顶点数和弧数 Graph; 3.2基本操作 CreateUDN(Graph &G) 操作结果:用邻接矩阵创建带权无向网图。 DFS(Graph G,int k) 操作结果:对已存在的图进行深度优先遍历。 BFS(Graph G) 操作结果:对已存在的图进行广度优先遍历。 choose(Graph G) 操作结果:对将要实现的操作步骤进行选择。 4 程序包含两个模块 主程序模块,其中主函数为 int main 输入信息; 根据输入要求进行选择操作和输
8、出; 输出结果; 选择操作模块实现具体选择的对应操作及输出操作。 两模块之间关系如下图3.1所示5 主函数模块选择操作模块递归调用 图3.1 模块关系图 3.3详细设计 程序流程图如图3.2所示 主函创建无向网函数据输入选择操作模块1.深度优先遍历2.广度优先遍历数据输出数据输出结束 6 图3.2 程序流程图 函数设计程序设计中主要包括下列函数用邻接矩阵创建一个图: void CreateUDN(Graph &G) 用邻接矩阵创建一个带权无向网图; 输入顶点数和弧数; 输入各个顶点及各条弧; 递归方法实现图的遍历: void DFS(Graph G, int k) 用递归的方法访问图中的结点;
9、 对图进行深度优先遍历; 非递归方法实现图的遍历: void BFS(Graph G) 用队列辅助访问图中的结点; 对图进行广度优先遍历; 选择输出需要的遍历方法: 7 void choose(Graph G) 给出程序运行的选项; 对相应的输入选项调用相应的函数以执行操作; 8 四 运行调试结果 例:遍历如下无向图(图 4.1)(a,b,c,d,e分别表示V1 V2 V3 V4 V5五个顶点) 以图4.1为例 步骤一: 运行程序,按提示首先输入顶点数和弧数。 图4.2输入顶点数和弧数 步骤二: 输入顶点和弧 (1)输入顶点 9 图4.3 输入各顶点 (2)输入弧 10 输入各条弧4.3 图
10、步骤三: 选择便利方式以及选择后结果 1操作显示广度优先编历结果 选择 4.4 图广度优先结果11 选2操作显示深度优先遍历 图4.4深度优先遍历结果 12 五 结论与致谢 在程序设计中我主要是解决的是给出一个图如何用多种方法完成图的遍历的问题,也包括如何创建一个图,深度优先遍历和广度优先遍历一个图,递归和非递归的方法实现图的遍历。程序最终通过调试运行,初步实现了设计目标。 图是一种较为复杂且重要的数据结构,其特殊性在于图形结构中结点之间的关系可以是任意的,图中任意两个数据元素之间都有可能相关。用邻接矩阵作为图的数据存储结构很好地解决了图的结构难点, 借助于邻接矩阵容易判定任意两个顶点之间是否
11、有边(或弧)相连,并容易求得各个顶点的度。该程序通俗易懂且实用性强,并且该程序清单详细具体、全面、具有很强的可读性;系统整体上比较完美,可以从键盘获取输入元素,并且可以根据用户输入进行选择性地输出;整体输出画面效果整洁、大方。 这次课程设计也让我充分认识到数据结构这门课的重要性。它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。同时它也有广泛的实际应用。 最后,我还要特别感谢我们的辅导老师申静老师,在她的精心辅导和帮助下,我的设计才得以顺利完成。对她为我们的设计所提出的宝贵意见表示忠心的感谢! 13 参考文献 1谭浩强. C程序设计第三版. 北京:清华大学出版社. 2罗宇等.
12、 数据结构M . 北京邮电大学出版社. 3严藯敏. 数据结构C语言版. 北京:清华大学出版社. 4杨路明. C语言程序设计教程. 北京邮电大学出版社. 5徐孝凯. 数据结构课程实验. 清华大学出版社. 14 六 附录 源程序代码 / 程序功能:采用递归和非递归算法,有向图和无向图,邻接矩阵和邻接表等多种结构存储实现图的遍历。 / 程序作者:英茜 / 最后修改日期:2014-1-3 #includestdio.h #includestdlib.h #define INFINITY 32767 #define MAX_VEX 20 /最大顶点个数 #define QUEUE_SIZE (MAX_V
13、EX+1) /队列长度 bool *visited; /访问标志数组 int z=1; /图的邻接矩阵存储结构 typedef struct char *vexs; /顶点向量 15 int arcsMAX_VEXMAX_VEX; /邻接矩阵 int vexnum,arcnum; /图的当前顶点数和弧数 Graph; class Queue /队列类 public: void InitQueue() base=(int *)malloc(QUEUE_SIZE*sizeof(int); front=rear=0; void EnQueue(int e) baserear=e; rear=(rea
14、r+1)%QUEUE_SIZE; void DeQueue(int &e) e=basefront; front=(front+1)%QUEUE_SIZE; 16 int *base; int front; int rear; ; int Locate(Graph G,char c) /图G中查找元素c的位置 for(int i=0;iG.vexnum;i+) if(G.vexsi=c) return i; return -1; void CreateUDN(Graph &G) /创建无向网 int i,j,w,s1,s2; char a,b,c,temp; 牰湩晴尨输入顶点数和弧数(顶点数和
15、弧数之间以空格隔开) : ); scanf(%d%d,&G.vexnum,&G.arcnum); 17 temp=getchar(); /接收回车 G.vexs=(char *)malloc(G.vexnum*sizeof(char); /分配顶点数目 牰湩晴尨输入%d个顶点.n,G.vexnum); for(i=0;iG.vexnum;i+) /初始化顶点 scanf(%c,&G.vexsi); temp=getchar(); /接收回车 for(i=0;iG.vexnum;i+) /初始化邻接矩阵 for(j=0;jG.vexnum;j+) G.arcsij=INFINITY; 牰湩晴尨输
16、入%d条弧.n,G.arcnum); for(i=0;i=0 & kG.vexnum) /k合理 for(int i=0;i=0 & i=0 & 19 jG.vexnum) /i,j合理 for(int k=j+1;kG.vexnum;k+) if(G.arcsik!=INFINITY) return k; return -1; /深度优先遍历 void DFS(Graph G,int k) int i; DFS执第 一次行/ if(k=-1) 时-1 ,k为 for(i=0;i %c,G.vexsk); +z; /访问第k个顶点 if(z-1)%G.vexnum=0) z=1; for(i=
17、FirstVex(G,k);i=0;i=NextVex(G,k,i) if(!visitedi) DFS(G,i); /对k的尚未访问的邻接顶点i递归调用DFS /广度优先遍历 void BFS(Graph G) int k; Queue Q; /辅助队列Q Q.InitQueue(); for(int i=0;i=0;w=NextVex(G,k,w) if(!visitedw) /w为k的尚未访问的邻接顶点 visitedw=true; printf(- %c ,G.vexsw); Q.EnQueue(w); printf( 请继续选择:n); void choose(Graph G) /对
18、输入选项调用相应的函数执行操作 int i,m; visited=(bool *)malloc(G.vexnum*sizeof(bool); 22 scanf(%d,&m); switch(m) case 1: 牰湩晴尨广度优先遍历: ); for(i=0;iG.vexnum;i+) visitedi=false; BFS(G); choose(G); printf();break; case 2: 牰湩晴尨深度优先遍历: ); for(i=0;iG.vexnum;i+) visitedi=false; DFS(G,-1); printf( 请继续选择:n);choose(G);break; 慣敳?瀺楲瑮?程序结束.); break; default : printf( 输入错误!n请在1-3中选择:n); choose(G); 23 /主函数 void main() int i,m; Graph G; CreateUDN(G); n); 牰湩晴尨有如下选项供选择:printf(); 3:1:printf(|*| 广度优先遍历 2:深度优先遍历|*|n); 退出本程序!printf(); (1-3):n); 牰湩晴尨请选择choose(G); 24
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1