1、数据结构地图导游系统含源码数据结构地图课程设计含源码数据结构课程设计报告题 目: XXXX大学校园导游系统院系名称: 计算机学院专业名称: 软件工程班 级: 2012级01班学生姓名: XX学号(8位): XX指导教师: XX设计起止时间:2013年12月16日2013年12月27日一. 设计目的进一步的了解图的遍历的问题,图的DFS,BFS的递归和非递归算法的实现,实现图的遍历,用邻接矩阵和邻接表的存储方式存储图。 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。 训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题。 训
2、练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。 提高综合运用所学的理论知识和方法独立分析和解决问题的能力。二. 设计内容1、设计并显示学校的校园平面图,地点(地点名称、地点介绍), 路线(公里数)均不少于10个。(文件存储)2、提供图中任意地点相关信息的查询。3、提供图中任意地点的问路查询:1)任意两个地点之间的一条最短的简单路径; (最短路径长度中转次数最少)2)任意两个地点之间的一条最佳访问路线; (带权(公里数)最短路径长度) 3)任意两个地点之间的所有简单路径。4、提供图中所有地点的最佳布网方案;5
3、、增加新地点和路线、撤销旧地点和路线。三概要设计1.各个模块详细的功能描述。int Locate(AdjMatrix *G,char name); 根据景点名称查找景点编号int VexExit(); 判断景点是否存在int Creat(AdjMatrix *G); 创建无向图void Savefile(AdjMatrix *G); 将图保存到文件中void Readfile(AdjMatrix *G); 从指定文件中读取信息并存入图中void ShowSchool(AdjMatrix *G); 显示校园全景图void ShowRoute(AdjMatrix *G); 显示图的所有路线void
4、 ShowVex(AdjMatrix *G); 显示图中所含景点的信息void Serach(AdjMatrix *G); 查找景点void AddRoute(AdjMatrix *G); 增加新路线void DeleteRoute(AdjMatrix *G); 删除旧路线void AddVex(AdjMatrix *G); 增加新景点void DeleteVex(AdjMatrix *G); 删除旧景点void Dijkstra(AdjMatrix *G,int start,int ending,int dist,int pathMAXVEX); 求起点到终点的最短路线void Prim(A
5、djMatrix *G,int start); 采用Prim算法求得最短连通路线void miniSpanTree(AdjMatrix *G); 查询从某个景点的最短连通路线void DFS(AdjMatrix *G,int start,int ending,int stack,int visited); 深度遍历查找所有路径void SimpleRoute(AdjMatrix *G); 查询两个景点间的最优路径void SearchAllRoute(AdjMatrix *G); 输出两景点之间的所有路径void menu(); 显示主菜单void menu1(); 开始菜单界面void me
6、nu2(); 退出菜单界面四详细设计1 功能函数的调用关系图;ShowRouteShowSchool调用Locate调SerachVexExit用AddRouteLocate调用LocateDeleteRoute调用VexExitDeleteVex调用调用LocateShortCutDijkstraminiSpanTreePrim调用DFSSimpleRoute调用 DFSSearchAllRoute调用2.功能模块图:开始menu1mainmenuchoiceShowSchoolReadfilechoice=1choice=2ShowVexReadfileReadfileSerachchoi
7、ce=3SavefileReadfileAddRoutechoice=4SavefileDeleteRouteReadfilechoice=5SavefileAddVexReadfilechoice=6SavefileDeleteVexReadfilechoice=7SimpleRouteReadfilechoice=8ShortCutReadfilechoice=9miniSpanTreeReadfilechoice=10SerachAllRouteReadfilechoice=11SavefileCreatchoice=12choice=0menu2结束2 各功能函数的数据流程图;Save
8、fileCreat写入vexnum,arcnum输入vexnum,arcnumi=0ii=0i写入name,introduce输入name,introducei+i=0ii=0i存入路线,距离输入start,ending,distance结束结束SerachReadfilechoice读出vexnum,arcnum输出编号为n信息nichoice=1保存name,introduce输出名称为name信息namechoice=2i结束保存路线,距离结束DeleteRouteAddRoute输入start,ending,distance输入start,ending,distance调用 调用Loc
9、ateLocate在arcs中赋初值在arcs中存入distance结束结束AddVexDeleteVex输入name,introduce输入name,introduce调用 调用LocateLocate从图中最后一个节点依次往前覆盖在arcs中初始化vexnum+vexnum+结束结束DFS用for查找起点的邻接点输出stack数组存放的路径若是终点,直接输出标志该点被访问存入stack数组stack下标往后移3.重点设计及编码。(1)文件的保存与读取:1.将图的顶点数和边数写入文件2.将图的顶点名称和介绍写入文件,用for循环控制;3.将图中路线的起点和终点以及距离写入文件;4.文件的读取
10、与保存原理一样。编码:void Savefile(AdjMatrix *G); 将图保存到文件中void Readfile(AdjMatrix *G); 从指定文件中读取信息并存入图中(2)深度遍历:用递归的方法,从某个节点出发,访问此节点,然后依次从出发节点的各个未被访问的邻接点出发深度优先搜索遍历;将走过的路径存入数组中,找到终点时输出路径。该函数模块用于查找两点之间的所有路径以及最优路径,找最优路径时,定义一个数组及最小值,每次最小值更新,就将路径值数组赋值到最优路径数组中去。编码:void DFS(AdjMatrix *G,int start,int ending,int stack,
11、int visited); (3)最小生成树prim算法从图中的某一顶点v0出发,选择与它关联的具有最小权值的边,将其顶点加入到生成树的顶点集合中,以后的每一步从在生成树中的一个顶点,而另一个顶点不在生成树顶点集合中的各条边中选择权值最小的边,再把它的顶点加入到生成树顶点集合中,直到所有顶点都加入到生成树集合中编码: void Prim(AdjMatrix *G,int start); /采用Prim算法求得最短连通路线(4) 最短路径Dijkstra算法用带权的邻接矩阵存储该带权有向图,借助一个辅助的一维数组dist 记录从源点到其余各顶点的最短距离值,二维数组path 记录某顶点是否加入到
12、集合S中,如果pathi0=1,则表示顶点Vi加入到集合S中,并且pathi所在的行最终记录了从源点到Vi的最短路径上的各个顶点,否则,pathi0=0,则表示顶点Vi还在集合V-S中。编码:void Dijkstra(AdjMatrix *G,int start,int ending,int dist,int pathMAXVEX); /求起点到终点的最短路线五测试数据及运行结果1 正常测试数据(3组)及运行结果;(1) 查询景点时输入正确景点编号(2)校园所有景点的信息(3)查询两点之间的最优路径2非正常测试数据(2组)及运行结果。(1) 输入错误的景点编号(2)输入不存在的景点六调试情况
13、,设计技巧及体会1 对自己的设计进行评价,指出合理和不足之处,提出改进方案;好的地方:(1)在文件的存储方面比较满意,先将图的顶点数目和边的数目存入文件,再将顶点信息存入,最后将路线的信息存入文件中。达到了将整个图存入文件的目的,相对于其他存储方法较为简洁且功能完善。(2)对于查询、增加、删除部分,都先输出已有的景点路线信息,方便用户操作。并且在用户输入错误时会有相应的错误处理。(3)代码的格式比较整齐,易读。考虑到了很多细节。不足的地方:(1) 每次对图进行操作,都要先从文件中读取重建一个图,比较繁琐;(2) 在查找中转路径次数最少的时候调用了查找所有路径的函数,先是找到所有路径再对次数进行
14、比较,并且若中转次数最少的路径不止一条时,最终只能输出一条路径,有缺陷,算法不够优化;2 对设计及调试过程的心得体会。课程设计刚开始时,思路有点混乱,只知道用文件把图存起来,每次操作时将信息读入图中,具体该怎么实现,还真不知道。看了一下课本,决定用邻接矩阵存储图。图的存储方式决定好后,就开始文件的存储,个人觉得在文件的存储方面想法不错,但是在文件的写入与读取格式的地方出了一点小问题,在调试的过程中对文件又熟悉了一点。这次课程设计不像以前马马虎虎,漏掉取址符,标点符号等,只会出现逻辑错误,在整个过程中也比较顺利。当不会一些算法的时候,我会查阅资料以及上网XX。把所有的功能实现后就开始细化自己的代
15、码,比如对用户错误输入的错误处理,写小函数如VexExit来让程序更加模块化,以及对界面的改进,只希望自己的代码更加完美。七参考文献(1)数据结构(C语言版) 严蔚敏 吴伟民 编著 清华大学出版社 2002(2) 数据结构与算法 王曙燕 王春梅 编著 人民邮电出版社 2013八附录:源代码(电子版)#include #include #include#include#include#include#include#define MAXVEX 20#define INFINITY 32768typedef struct /顶点类型int num; / 景点的编号char name20; /景点的
16、名称char introduce100; / 景点的介绍Vextype;typedef struct /邻接矩阵int arcsMAXVEXMAXVEX; /边集,存放权值Vextype vexMAXVEX; /顶点集int vexnum; /顶点的数目int arcnum; /边的数目AdjMatrix;int Locate(AdjMatrix *G,char name); /根据景点名称查找景点编号int VexExit(); /判断景点是否存在int Creat(AdjMatrix *G); /创建无向图void Savefile(AdjMatrix *G); /将图保存到文件中void
17、 Readfile(AdjMatrix *G); /从指定文件中读取信息并存入图中void ShowSchool(AdjMatrix *G); /显示校园全景图void ShowRoute(AdjMatrix *G); /显示图的所有路线void ShowVex(AdjMatrix *G); /显示图中所含景点的信息void Serach(AdjMatrix *G); /查找景点void AddRoute(AdjMatrix *G); /增加新路线void DeleteRoute(AdjMatrix *G); /删除旧路线void AddVex(AdjMatrix *G); /增加新景点voi
18、d DeleteVex(AdjMatrix *G); /删除旧景点void Dijkstra(AdjMatrix *G,int start,int ending,int dist,int pathMAXVEX); /求起点到终点的最短路线void Prim(AdjMatrix *G,int start); /采用Prim算法求得最短连通路线void miniSpanTree(AdjMatrix *G); /查询从某个景点的最短连通路线void DFS(AdjMatrix *G,int start,int ending,int stack,int visited); /深度遍历查找所有路径voi
19、d SimpleRoute(AdjMatrix *G); /查询两个景点间的最优路径void SearchAllRoute(AdjMatrix *G); /输出两景点之间的所有路径void menu(); /显示主菜单void menu1(); /开始菜单界面void menu2(); /退出菜单界面int Locate(AdjMatrix *G,char name) /根据景点名称查找景点编号int i;for(i=1;ivexnum;i+)if(!strcmp(name,G-vexi.name)return i;return -1;int VexExit(AdjMatrix *G,int
20、index) /判断景点是否存在if(index0 & indexvexnum)return 1;elseprintf(该景点不存在!n);return 0;int Creat(AdjMatrix *G) /创建无向图int i,j,k,weight;char name20;printf(请输入校园图中的景点数目和路线数目:n);scanf(%d%d,&G-vexnum,&G-arcnum);for(i=1;ivexnum;i+) /权值数组初始化for(j=1;jvexnum;j+)G-arcsij=INFINITY;printf(请输入校园图中%d个景点的名称及介绍:n,G-vexnum)
21、;for(i=1;ivexnum;i+)printf(请输入第%d个景点:,i);G-vexi.num=i;/flushall();scanf(%s%s,G-vexi.name,G-vexi.introduce);printf(请输入校园图中的%d条路线:n,G-arcnum);for(k=1;karcnum;k+) /存入路线printf(请输入第%d条路线:n,k);printf(起点:);scanf(%s,name);i=Locate(G,name);printf(终点:);scanf(%s,name);j=Locate(G,name);printf(距离:);scanf(%d,&wei
22、ght);G-arcsij=weight;G-arcsji=weight;return 1;void Savefile(AdjMatrix *G) /将图保存到文件中FILE *fp;int i,j;fp=fopen(Graph.txt,wt);if(!fp)printf(写文件出错,按任意键退出!n);getch();exit(1);fprintf(fp,%d %dn,G-vexnum,G-arcnum); /先将图的顶点数目和边集数目存入文件,便于控制下面程序的for循环for(i=1;ivexnum;i+) /接着存放顶点的信息fprintf(fp,%s %sn,G-vexi.name,
23、G-vexi.introduce);for(i=1;ivexnum;i+) /最后存放边的信息即路线信息for(j=1;jarcsij!=INFINITY)fprintf(fp,%s %s %dn,G-vexi.name,G-vexj.name,G-arcsij);printf(n文件已成功保存,按任意键返回!n);getch();fclose(fp);void Readfile(AdjMatrix *G) /从指定文件中读取信息并存入图中FILE *fp;int i,j;int start,ending;char startpoint20,endpoint20;int distance;fp
24、=fopen(Graph.txt,rt);if(!fp)printf(读文件出错,按任意键退出!n);getch();exit(1);fscanf(fp,%d%d,&G-vexnum,&G-arcnum); /先读取文件中的前两个整型,存入图的顶点数目和边数目中/对图的权值数组进行初始化for(i=1;ivexnum;i+)for(j=1;jvexnum;j+)G-arcsij=INFINITY;/从文件中读取顶点信息并存入图中for(i=1;ivexnum;i+)G-vexi.num=i;fscanf(fp,%s%s,G-vexi.name,G-vexi.introduce);/从文件中读取路线并存入图中for(j=1;jarcnum;j+)fscanf(fp,%s%s%d,startpoint,endpoint,&distance);start=Locate(G,startpoint);ending=Locate(G,endpoint);G-arcsstartending=distance;G-arcsendingstart=distance;void ShowSchool() /显示校园全景图printf(ttn);printf(tt xxxxxxxx大学校园平面图
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1