




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章图结构及其应用课 程 设 计 课程名称 数据结构 题目名称 广东工业大学校园导游系统 学生学院 计算机学院 专业班级 软件工程0802 学 号 3108006869 学生姓名 范庆雄 指导教师 李杨 2010 年 7 月 7日校园导游系统设计一、 设计要求1问题描述课程设计 5.5 校园导游系统设计一个校园导游程序,为来访的客人提供信息查询服务。2需求分析(1)设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图(无向网),以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。(2)存放景点代号、名称、简介等信息供用户查询。(3)为来访客人提供图中任意景点相关信息的查询。(4)为来访客人提供图中任意景点之间的问路查询。(5)可以为校园平面图增加或删除景点或边,修改边上的权值等。二、 概要设计为了实现以上功能,可以从3个方面着手设计。1主界面设计为了实现校园导游系统各功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图7-10所示。2存储结构设计本系统采用图结构类型(mgraph)存储抽象校园图的信息。其中:各景点间的邻接关系用图的邻接矩阵类型(adjmatrix)存储;景点(顶点)信息用结构数组(vexs)存储,其中每个数组元素是一个结构变量,包含景点编号、景点名称及景点介绍三个分量;图的顶点个数及边的个数由分量vexnum、arcnum表示,它们是整型数据。此外,本系统还设置了三个全局变量:visited 数组用于存储顶点是否被访问标志;d 数组用于存放边上的权值或存储查找路径顶点的编号;campus是一个图结构的全局变量。3系统功能设计本系统除了要完成图的初始化功能外还设置了8个子功能菜单。图的初始化由函数initgraph( )实现。依据读入的图的顶点个数和边的个数,分别初始化图结构中图的顶点向量数组和图的邻接矩阵。8个子功能的设计描述如下。(1)学校景点介绍学校景点介绍由函数browsecompus( )实现。当用户选择该功能,系统即能输出学校全部景点的信息:包括景点编号、景点名称及景点简介。(2)查看浏览路线查看浏览路线由函数shortestpath_dij( )实现。该功能采用迪杰斯特拉(Dijkstra)算法实现。当用户选择该功能,系统能根据用户输入的起始景点编号,求出从该景点到其它景点的最短路径线路及距离。(3)查看两景点间最短路径查看两景点间最短路径由函数shortestpath_floyd( )实现。该功能采用弗洛伊德(Floyd)算法实现。当用户选择该功能,系统能根据用户输入的起始景点及目的地景点编号,查询任意两个景点之间的最短路径线路及距离。(4)景点信息查询景点信息查询由函数seeabout( )实现。该功能根据用户输入的景点编号输出该景点的相关信息。例如,景点编号、名称等。(5)更改图的信息更改图的信息功能由主调函数changegraph( )及若干个子函数完成,可以实现图的若干基本操作。例如:增加新的景点、删除边、重建图等。(6)查询景点间可行路径该功能是查询两景点间所有可行路径,由函数allpath( )和函数path( )实现,其中path( )函数是直接递归函数。由于是无向网,如果网中的边数很多,任意两个景点间的所有路径也会有限多,但很多路径是无实际意义的(有近路,为什么去走远路呢?)。所以,本算法在求得的两景点间所有可行路径中,限制只输出路径长度不超过8个景点的路线。(7)打印邻接矩阵该功能即输出图的邻接矩阵的值,由函数printmatrix( )实现。(8)退出即退出校园导游系统,由exit(0)函数实现。三、 模块设计1校园抽象图设计以:广东工业大学大学城校区主要景点为例,抽象完成的无向网如图7-7所示。全校共抽象出28个景点,39条道路。各景点分别用图中的顶点表示,景点编号从0-27;39条道路分别用图中的边表示,边上的权值表示景点之间的模拟距离。2模块设计本程序包含3个模块:主程序模块、工作区模块和无向网操作模块。调用关系如图7-8所示。主程序模块工作区模块无向网操作模块图7-8 模块调用示意图3系统子程序及功能设计本系统共设置18个子程序,各子程序的函数名及功能说明如下。ADT Graph() 数据对象V:V是具有相同特性的数据结构元素的集合,称为定点集。关系R:VR+(v,w)|v ,w (v,w )表示v,w之间的存在路径(1)mgraph initgraph( ) 初始条件: 图G不存在操作结果: 图的初始化(2)int locatevex(mgraph c, int v) 初始条件:图G存在 操作结果:查找景点在图中的序号(3)void path(mgraph c, int m,int n,int k) 初始条件:图G存在 操作结果:打印序号为m,n景点间的长度不超过8个景点的路径(4)int allpath(mgraph c)初始条件:图G存在 操作结果:打印两景点间的景点个数不超过8的所有路径。调用(3)(5)void shortestpath_dij(mgraph c)初始条件:图G存在 操作结果:用Dijkstra算法,求一个景点到其他景点间的最短路径,并打印以下编号(6)(12)是图的基本操作。包括:重建图、更新信息、删除、增加结点和边等。(6)int creatgragh(mgraph &c)初始条件:图G存在 操作结果:建图。以图的邻接矩阵存储图(7)int newgraph(mgraph &c) 初始条件:图G存在 操作结果:更新图的部分信息。返回值:1(8)int enarc(mgraph&c)初始条件:图G存在 操作结果:增加一条边。返回值:1(9)int envex(mgraph&c) 操作结果:增加一个结点。返回值:1(10)int delvex(mgraph&c) 初始条件:图G存在 操作结果:删除图的一个顶点。返回值:1(11)int delarc(mgraph&c) 初始条件:图G存在 操作结果:删除图的一条边。返回值:1(12)void printmatrix(mgraph c) 操作结果:输出图的邻接矩阵(13)int changegraph(mgraph &c) 初始条件:图G存在 操作结果:图操作的主调函数。返回值:1(14)void shortestpath_floyd(mgraph c) 初始条件:图G存在 操作结果:用Floyd算法求任意两景点间的最短路径,并输出(15)void seeabout(mgraph c) 初始条件:图G存在 操作结果:查询景点的信息(16)void browsecompus(mgraph c) 初始条件:图G存在 操作结果:显示所有景点信息(17)mune()操作结果:打印菜单(18)void main ( ) 初始条件:无 操作结果:主函数。操作区用户界面4函数主要调用关系图18 main( )17 mune( )1165 1415134 129 6 7 8 10112 3 校园导游系统18个子程序之间的主要调用关系如图7-9所示。图中数字是各函数的编号。图7-9 系统函数调用关系图五、 测试分析系统运行主界面如图7-10所示。图7-10 校园导游系统主菜单各子功能测试运行结果如下。1学校景点介绍在主菜单下,用户输入1回车,运行结果如图7-11所示。图7-11 广东工业大学大学城小区景点名称及简介2查看浏览路线在主菜单下,用户输入.2回车,根据屏幕提示输入一个景点编号4回车后,系统会给出由景点4到其余27个景点的最短浏览线路及最短距离。运行结果的截图如图7-12所示。不足之处:线路的编排受景点编号的影响,有些可能不合理。图7-12 从一个景点出发的浏览路线图3查看两景点间最短路径在主菜单下,用户输入3回车,根据屏幕提示输入一个出发景点编号及目的地景点编号:3 17回车后,运行结果如图7-13所示。图7-13 任意两个景点之间的最短浏览路线图4景点信息查询在主菜单下,用户输入4回车,根据屏幕提示输入一个要查询的景点编号20回车后,运行结果如图7-14所示。图7-14 景点信息查询5更改图的信息在主菜单下,用户输入5回车后出现二级菜单界面,运行结果如图7-15所示。再进一步做选择,可以实现图的相关基本操作。图7-15 更改图的信息6查询景点间可行路径本算法在求得的两景点间所有可行路径中,限制只输出路径长度不超过8个景点的路线。在主菜单下,用户输入6回车,根据屏幕提示输入要查询的两个景点编号:5 17回车后,运行结果截图如图7-16所示。本功能由递归函数实现,所以当图中的边数过多时,可能造成死循环而得不到正确结果。不足之处:线路的编排受景点编号的影响,有些可能不合理。图7-16 查询两景点间的可行路径7打印邻接矩阵在主菜单下,用户输入7回车,即可输出图的邻接矩阵的值。如图7-17所示。图7-17 图的邻接矩阵7.清屏在主菜单下输入7,8退出在主菜单下,用户输入8回车,即退出校园导游系统。 四、 详细设计1数据类型定义(1)无向带权图(无向网)的定义typedef struct arcell /边的权值信息 int adj; /权值arcell,adjmatrixMaxVertexNumMaxVertexNum; /图的邻接矩阵类型typedef struct vexsinfo /顶点信息 int position; /景点的编号char name32; /景点的名称 char introduction256; /景点的介绍vexsinfo;typedef struct mgraph /图结构信息 vexsinfo vexsMaxVertexNum; /顶点向量(数组) adjmatrix arcs; /邻接矩阵 int vexnum,arcnum; /分别指定顶点数和边数mgraph;(2)全局变量定义int visited35; /用于标志顶点是否已经访问过int d35; /用于存放权值或存储路径顶点编号mgraph campus; /图变量(大学校园)2系统主要子程序详细设计(1)主程序模块设计主函数。设定用户操作界面的颜色和大小,调用工作区模块函数。void main( ) system(color 1f); /屏幕颜色设定 mainwork( );(2)用户工作区模块设计主要工作函数。操作区用户界面设计。void mainwork( )int yourchoice;campus=initgraph( );printf(n-欢迎使用校园导游程序-n);printf(n 广东工业大学! nn);printf(n 菜 单 选 择 nn);printf( 1. 学校景点介绍 2. 查看游览路线 n);printf( 3. 查询景点间最短路径 4. 景点信息查询 n);printf( 5. 更改图信息 6. 查询景点间可行路径 n);printf( 7. 打印邻接矩阵 8. 退出 n);printf(n-n);printf(请输入你的选择:);scanf(%d,&yourchoice);while(!(yourchoice=1|yourchoice=2|yourchoice=3|yourchoice=4|yourchoice=5|yourchoice=6 |yourchoice=7|yourchoice=8)printf (输入选择不明确,请重新输入n);scanf(%d, &yourchoice);while(1)switch(yourchoice)case 1:system(cls);browsecompus(campus);break;case 2:system(cls);shortestpath_dij(campus);break;case 3:system(cls);shortestpath_floyd(campus);break;case 4:system(cls);seeabout(campus);break;case 5:system(cls);changegraph(campus);break;case 6:system(cls); allpath(campus); break;case 7: system(cls); printmatrix(campus); break;case 8: system(cls);exit(0); break;default: break; printf(n-欢迎使用校园导游程序-n); printf(n 广东工业大学 ! nn); printf(n 菜 单 选 择 nn); printf( 1. 学校景点介绍 2. 查看游览路线 n); printf( 3. 查询景点间最短路径 4. 景点信息查询 n); printf( 5. 更改图信息 6. 查询景点间可行路径 n); printf( 7. 打印邻接矩阵 8. 退出 n); printf(n-n); printf(n请输入你的选择:); scanf(%d, &yourchoice);/endwhile(1)/mainwork(3)无向网操作主调模块设计int changegraph(mgraph &c) int yourchoice; printf(n请问是要nn (1)再次建图 (2)删除结点 (3)删除边 n); printf(n (4)增加结点 (5)增加边 (6)更新信息 nn (7)打印邻接矩阵 (8)返回? nn);scanf(%d,&yourchoice); printf(nn); while(!(yourchoice=1|yourchoice=2|yourchoice=3|yourchoice=4|yourchoice=5|yourchoice=6 |yourchoice=7|yourchoice=8) printf(输入选择不明确,请重输n);scanf(%d,&yourchoice); while(1) switch(yourchoice)case 1:creatgragh(c);break;/ 重建图,调用(6)case 2: delvex(c);break; / 删除顶点,调用(10)case 3:delarc(c);break; / 删除边,调用(11)case 4:envex(c);break; / 增加顶点,调用(9)case 5:enarc(c);break; / 增加边,调用(8)case 6: newgraph(c);break; / 更新图的信息,调用(7)case 7: printmatrix(c);break; / 输出邻接矩阵,调用(12)case 8:return 1; / 返回主菜单 printf(n请问是要nn (1)再次建图 (2)删除结点 (3)删除边 n); printf(n (4)增加结点 (5)增加边 (6)更新信息 nn (7)打印邻接矩阵 (8)返回? nn); scanf(%d,&yourchoice); printf(nn);while(!(yourchoice=1|yourchoice=2|yourchoice=3|yourchoice=4|yourchoice=5|yourchoice=6 |yourchoice=7|yourchoice=8)printf(输入选择不明确,请重输n);scanf(%d,&yourchoice); /endwhile(1) return 1;/changegraph(4)求两景点间的所有路径int allpath(mgraph c) / 4. 求两景点间的所有路径/算法中将路径起始点编号m存入d 0数组元素中,并将其顶点访问标志设置为1,即visitedm=1/然后调 path( ) 函数求由m出发到景点n的所有路径。 int k, i, j, m, n; printf(nn请输入你要查询的两个景点编号:nn); scanf(%d%d,&i,&j); printf(nn); m=locatevex(c,i); /调用2,确定该顶点是否存在。若存在,返回该顶点编号 n=locatevex(c,j); d0=m; /存储路径起点m (int d 数组是全局变量) for(k=0;kc.vexnum;k+) /全部顶点访问标志初值设为0 (int visited 数组是全局变量) visitedk=0; visitedm=1; /第m个顶点访问标志设置为1 path(c,m,n,0); /调用3。k=0,对应起点d0= =m。k为d 数组下标 return 1;/endallpathvoid path(mgraph c, int m,int n,int k) / 3. 自递归调用函数。若顶点s是由m出发到景点n的路径上的顶点,则调用自身,求由s出发的所/有可能到达顶点n的路径。找到一条(递归出口),输出一条(限制只输出景点个数=8的路径)。/d 数组存储由m出发到景点n的路径上的顶点编号,visited 数组用于存放顶点是否被访问的标志 int s, x=0, t=k+1; / t 用于存放路径上下一个顶点对应的d 数组元素的下标 if (dk=n & k8) /递归出口,找到一条路径。若dk是终点n且景点个数=8,则输出该路径 f or (s=0;s,); /输出该路径。s=0 时为起点m printf(%snn,); /输出最后一个景点名(即顶点n的名字,此时s=k) else s=0; while(sc.vexnum) /从第m个顶点,试探至所有顶点是否有路径 if(c.arcsdks.adjInfinity) & (visiteds= =0) /初态:顶点m到顶点s有边,且未被访问 visiteds=1; dk+1=s; /存储顶点编号s 至dk+1中 path(c,m,n,t); /求从下标为t=k+1的第dt=s个顶点开始的路径(递归调用),/同时打印出一条m至n的路径 visiteds=0; /将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径 s+; /试探从下一个顶点 s 开始是否有到终点的路径 /endwhile /endelse/endpath(5)用迪杰斯特拉(Dijkstra)算法,求一个景点到其它景点间的最短路径并打印void shortestpath_dij(mgraph c) / 5. 迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经p 及其带权长度dv (最短路经的距离) / p 数组用于存放两顶点间是否有通路标志。若pvw= =1,则w是从v0到v的最短路经上的顶点。 / final 数组用于设置访问标志。 int v, w, i, min, t=0, x, flag=1, v0; /vo为起始景点的编号 int final35, d35, p3535; printf(n请输入一个起始景点的编号:); scanf(%d,&v0); printf(nn); while(v0c.vexnum) printf(n你所输入的景点编号不存在n); printf(请重新输入:); scanf(%d,&v0); /while for(v=0;vc.vexnum ;v+) finalv=0; /初始化各顶点访问标志dv=c.arcsv0v.adj; /v0 到各顶点 v 的权值赋值给dvfor(w=0;wc.vexnum ;w+) /初始化p 数组,各顶点间的路径全部设置为空路径0pvw=0;if(dvInfinity) /v0 到v 有边相连,修改pvv0的值为1pvv0=1; pvv=1; /各顶点自己到自己要连通 /for dv0=0; /自己到自己的权值设为0 finalv0=1; / v0的访问标志设为1,v 属于 s 集 for(i=1;ic.vexnum ;i+) /对其余c.vexnum-1个顶点w,依次求 v 到 w 的最短路径 min=Infinity;for(w=0;wc.vexnum ;w+) /在未被访问的顶点中,查找与 v0 最近的顶点v if(!finalw)if(dwmin) / v0 到 w (有边)的权值minv=w;min=dw;/iffinalv=1; / v 的访问标志设置为1,v 属于s集for(w=0;wc.vexnum ;w+) /修改v0 到其余各顶点w 的最短路径权值dw if(!finalw&(min+c.arcsvw.adj dw) /若w 不属于s,且v 到w 有边相连 dw=min+c.arcsvw.adj; /修改v0 到w 的权值dw for(x=0;xc.vexnum ;x+) /所有v0 到v 的最短路径上的顶点x,都是v0 到w 的pwx=pvx; /最短路径上的顶点 pww=1;/if /for for(v=0;vc.vexnum ;v+) /输出v0 到其它顶点v 的最短路径 if(v!=v0) printf(%s,); /输出景点v0 的景点名for(w=0;w%s,);printf(-%s,); printf(n总路线长为%d米nn,dv); /for/shortestpath_dij(6)用弗洛伊德(floyd)算法,求两景点间的最短路径并打印void shortestpath_floyd(mgraph c) / 14. 用floyd算法,求各对顶点v和w间的最短路经p 及其带权长度dvw / 若pvwu= =1;则u是v到w的当前求得的最短路经上的顶点 int i, j, k, v, u, w, d3535, p353535; for(v=0;vc.vexnum ;v+) /初始化各对顶点 v,w 之间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混凝土施工质量监督管理方案
- 2025山东淄博市中心医院合同制专业技术人员招聘60人考试参考试题及答案解析
- 2025浙江大学嘉兴研究院区域发展战略研究室现招聘考试参考试题及答案解析
- 2025重庆鈊渝金融租赁股份有限公司社会招聘9人考试参考试题及答案解析
- 葫芦雕刻题库及答案
- 2025年啸亭杂录题目及答案
- 建设工程质量保证方案
- 城乡供水水质在线监测方案
- 2025年生活垃圾试题及答案
- 财务咨询服务合作协议
- 第二单元 观察物体(单元测试)-2024-2025学年三年级上册数学北师大版
- DB65-T 4773-2024 生物安全实验室消毒技术指南
- 人教版PEP四年级英语上册Unit-1-My-classroom课件
- 2024年新北师大版七年级上册数学全册课件(新版教材)
- 1安全生产关键节点清单及核查内容清单
- 抖音火花合同电子版获取教程
- HYT 0318-2021 填海项目竣工海域使用验收测量规范
- 高中历史知识竞赛省公开课一等奖全国示范课微课金奖课件
- 燃气管道保护方案(雨污分流二标)
- 护工礼仪培训课件
- 希沃白板实操校本培训课件
评论
0/150
提交评论