资源描述
琼州学院电子信息工程学院课程设计报告课程名称: 数据结构课程设计 设计题目: 校园导游咨询 专 业: 软件工程 班 级: 2010软件工程 学生姓名: 学 号: 起止日期: 指导教师: 指导教师评语: 最终成绩: 指导教师签名: 年 月 日成绩评定项 目权 重成 绩1、设计过程中的学习态度0.22、课程设计的质量及答辩0.53、设计报告书规范程度0.34、总成绩注意事项一、设计目的数据结构是一门实践性较强的软件基础课,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。二、设计要求1通过这次课程设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。2学生必须仔细研读数据结构课程设计要求,以学生自学为主、指导教师指导为辅,独立完成课程设计的任务,有问题及时主动与指导教师沟通。3本次课程设计按照教学要求需要在本学期15周前完成,学生要发挥自主学习的能力,充分利用时间,安排好课程设计的时间计划,并在课程设计过程中不断检测自己的计划完成情况,及时向指导教师汇报。4编程语言:C 语言。三、课程设计说明书的格式要求 设计文档的撰写必须提前进行,以保证使文档与程序同步提交。 1设计题目 2运行环境(软、硬件环境)3算法的需求分析 4算法概要设计5算法详细设计 6算法的测试7运行结果分析 8收获及体会四、问题分析、设计和测试过程要规范化1需求分析:将题目中要求的功能进行叙述分析。2概要设计:算法的设计说明,描述解决此问题的数据存储结构,(有些题目已经指定了数据存储的,按照指定的设计),描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。3详细设计:即各个算法的具体实现步骤,每个题目要有相应的源程序,其中每个功能模块采用不同的函数实现。源程序要规范编写:结构要清晰,注释要清楚。重点函数的重点变量和重点功能部分要加上清楚的程序注释。4调试和测试:给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来 。在调试过程中遇到的问题和解决方法也要记录下来。程序要能够正常运行,还要有基本的容错功能。尽量避免出现操作错误时出现死循环。5改进措施:对有些题目提出算法改进方案,比较不同算法的优缺点。五、对指导教师的要求指导教师要关心学生的课程设计进展,认真答疑。对课程设计报告的撰写要给予充分的指导,报告中切忌出现大篇源代码,应严格要求学生将主要篇幅放在“原理实现”上,即如何用框图表达设计和实施思想。课程设计报告要用红笔批阅,最终成绩以优、良、中、及格与不及格分等计算。目录摘要11 设计内容和要求- 2 -1.1设计内容- 2 -1.1设计要求- 2 -2 概要设计22.1 程序的模块图22.2 主函数的概要设计32.3 查找介绍函数的概要设计32.4 查找最短路径函数的概要设计32.5 景点分布图的概要设计32.6 退出函数的概要设计33 详细设计53.1 程序的流程图53.2 主函数的详细设计63.3 查找介绍函数的详细设计63.4 查找最短路径函数的详细设计73.5 景点分布图的详细设计83.6 退出函数的详细设计93.7 数据结构的详细设计94 软件测试104.1 菜单的测试104.2 查找景点简介的测试114.3 查找两个景点之间的最短距离的测试124.4 查看景点分布图的测试134.5 退出的测试145 软件使用说明156 参考文献167 附录177.1 系统完整代码17摘要现代快节奏的生活使得都市人越来越渴望亲近自然,因此外出旅游现在被越来越多的都市人所看中,所以如何快速方便的找到我们想要的旅游景点的信息和最短路径就成了一个很重要的问题。本设计基于图的结构,创建一个无向图,针对游客的实际需求,将琼州学院的景点编号、名称、介绍等信息放入到图的顶点当中并保存在景点文本文件当中,将两个景点的编号和它们之间的距离当作权值也保存到权值文本文件当中,利用迪杰斯特拉算法来求从一个景点到另一个景点的最短距离,利用Search( );函数来查找景点,并显示出它的信息,从而解决了要查找景点信息和景点之间的最短路径的问题,最后按照显示屏上的提示进行相关的操作。关键词:分布图、查找信息、最短距离、校园导游咨询1 设计内容和要求1.1设计内容依据课程设计的要求,利用一个无向图的结构,将景点当作图的顶点,将景点之间的距离当作权值来储存,然后根据游客自己的需求,按照显示屏上的提示来进行查找景点介绍,查找两个景点之间的最短距离,退出程序等基本操作。1.1设计要求本软件为校园导游咨询系统,根据游客的实际需求而设计,首先创建一个无向图,然后从文件当中读取所有景点的编号、名称、介绍和两点之间的权值,并将它们写入到无向图当中。功能主要包括查找已知景点的信息,查找从一个景点到另一个景点的最短路径,退出等基本操作。软件的界面要求使用VC+6.0的运行环境。软件的数据库包括校园景点的编号、名称、介绍和两个景点之间的距离(权值),首先要定义顶点的数据类型结构体,里面包括景点的编号、名称、介绍,然后定义一个邻接矩阵结构体来储存边的信息,最后定义一个无向图类型的结构体来储存顶点的信息,边的信息,顶点的个数,边的条数。最后游客按照显示屏上的提示来进行相关的操作。2 概要设计2.1 程序的模块图本软件的算法依据无向图的操作通过查找函数查找景点的信息,通过费洛伊德函数来查找最短距离,开始时首先从文件当中读取景点的编号、名称、介绍和两个景点之间的距离即权值,然后将其加入到图当中,再调用查找函数查找景点的信息,调用费洛伊德函数来查找最短距离,调用退出函数实现退出功能,其模块图如图2.5所示:开始加入图分布图退出最短距离查找信息屏幕显示屏幕显示屏幕显示图2.5模块图2.2 主函数的概要设计基于程序的操作要求,对于主函数的设计首先是显示一个可视化的操作界面提醒游客进行相关的操作和提示游客其可供选择的景点的名称,便于其在后面的操作过程当中能够快速方便的找到其需要查找的景点的名称。而后就是一个switch();的选择函数,提供查找景点信息,查找两个景点之间的最短距离和退出的相关的选择操作而后进入到每一个操作界面当中,从而实现所需要的功能。2.3 查找介绍函数的概要设计当游客选择了要查找景点的信息的介绍这一项功能的时候,就会进入到查找的界面,对于查找景点信息就是利用Search( );函数,当游客输入景点的名称的时候看其是否与文件当中的数据相匹配,如果有则输出它的介绍,如果没有则输出错误的提示提醒游客进行相关的操作来进入到正确的操作过程当中。2.4 查找最短路径函数的概要设计对于查找最短路径的这一项功能,可以利用迪杰斯特拉算法,但我是用的费洛伊德算法,相对来说步骤跟简单一点。后面有详细介绍。2.5 景点分布图的概要设计先手稿绘制所有景点的分布,利用printf();函数打印分布图的框架构造。各景点之间用线条链接,通过分布图能全面的对校园各景点有个方位感。2.6 退出函数的概要设计关于退出函数,则是当游客执行完了他想要进行的操作过后选择退出的功能的时候就调用退出函数exit(0);跳入到退出界面实现退出的功能。3 详细设计3.1 程序的流程图当我们想要更加实际的了解一个程序的算法过程的时候,我们就要依据程序的流程图来给我们一个比较实际的过程,从流程图当中能够更加清楚整个程序实现的过程是怎样的。其流程图如图3.1所示:start创建无向图写入无向图中Case 3Case 2Case 1查找信息最短路径TTFFCase 4分布图TendF图3.1流程图3.2 主函数的详细设计主函数是一个程序的主体,当我们要进行我们所需要的操作的时候我们就要根据主函数中的显示信息和它给我们的相关的提示信息来进行所需要的操作,因此在这次的程序实现的过程当中,调用Browser();提示游客根据switch();的选择语句,选择来进入到相关的操作界面实现程序的基本功能。, 3.3 查找介绍函数的详细设计当游客选择了要查找景点的信息的介绍这一项功能的时候,程序就会调用Search( );函数进入到查找景点的介绍的界面,当游客输入了需要查找的景点的编号的时候,程序通过结构体,自动匹配相应的信息,查找是否有这个景点。void Search(MGraph *G)int k,flag=1;while(flag)printf(请输入要查询的景点编号:);scanf(%d,&k);if(kG-vexnum)printf(景点编号不存在!请重新输入景点编号:);scanf(%d,&k);if(k0&kvexnum) flag=0;printf(nn);printf(编号景点名称 简介 n);printf(%-4d%-16s%-62sn,G-vexsk.num,G-vexsk.name,G-vexsk.introduction);printf(n);,找到将它的编号返回,并输出它的介绍,没有找到这输出错误提示,提醒游客进行相关的操作进入正确的操作过程当中。3.4 查找最短路径函数的详细设计当游客选择了要查找两个景点之间的最短距离这一项功能的时候,函数进入到查找两个景点之间的最短距离的操作界面当中,当游客输入了两个景点的名称过后,程序会判断是否有这两个景点,如果有则返回他们各自的编号,并调用Floyd( );函数进入到查找最短路径问题的程序当中。void Floyd(MGraph *G)int v,u,i,w,k,j,flag=1,p141414,D1414;for(v=1;vvexnum;v+)for(w=1;wvexnum;w+)Dvw=G-arcsvw.adj;for(u=1;uvexnum;u+)pvwu=0;if(DvwINFINITY)pvwv=1;pvww=1;for(u=1;uvexnum;u+)for(v=1;vvexnum;v+)for(w=1;wvexnum;w+)if(Dvu+DuwDvw)Dvw=Dvu+Duw;for(i=1;ivexnum;i+)pvwi=pvui | puwi;while(flag)printf(请输入出发点和目的地的编号:);scanf(%d%d,&k,&j);if(kG-vexnum | jG-vexnum)printf(景点编号不存在!请重新输入出发点和目的地的编号:);scanf(%d%d,&k,&j);if(k=j)printf(出发点和目的地一样!请重新输入出发点和目的地的编号:);scanf(%d%d,&k,&j);if(k0 & kvexnum & j0 & jvexnum)flag=0;printf(n最短游览路线:%s,G-vexsk.name);if(kj)for(u=G-vexnum;u0;u-)if(pkju & k!=u & j!=u)printf(-%s,G-vexsu.name);if(kj)for(u=1;uvexnum;u+)if(pkju & k!=u & j!=u)printf(-%s,G-vexsu.name);printf(-%s,G-vexsj.name);printf( 总路线长%dmn,Dkj);已知有n个顶点的有向图,佛洛伊德算法可以求解出每一对顶点之间的最短路径。假设使用邻接矩阵d ( i, j)来对图进行存储, d ( i, j)表示i 到j 之间的距离,但是该距离不一定是最短距离。佛洛伊德算法的基本思想是:为求顶点ij 之间的最短距离,需要进行n次试探。首先将0 加入路径,考虑路径i 0 j 是否存在,如果存在,则比较i j和i 0 j 的路径长度,取长度短的路径作为i j 的路径,记作(i ,j ) 。接着在路径上再增加一个顶点1 ,比较i1 j 和(i ,j )的路径长度, 取长度短的路径作为(i ,j) 。不断将顶点2 ,3 , .,n - 1加入进行试探, 最后得到的(i ,j )必定为i j 的最短路径。若使用数组dk ( i, j)表示加入顶点k后,最短路径长度的变化情况,使用数组pk ( i, j)表示加入顶点k后,最短路径上顶点的变化情况, 这样就求得了最短路径和最短路径长度。3.5 景点分布图的详细设计这里不详细介绍,具体代码,查看附录browse_view_distribute ( ) 函数。3.6 退出函数的详细设计对于退出函数,当游客选择了退出这一个操作的时候,程序就会调用exit(0); 函数实现退出主函数的功能。最后会提示游客,欢迎下次继续使用!3.7 数据结构的详细设计本软件的数据结构包括3个部分:1. 邻接矩阵typedef int AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;定义一个邻接矩阵,用邻接矩阵来定义和储存边的相关信息。2. 顶点的结构体typedef struct Vertex/定义图中顶点的数据类型int num;/景点编号char name30;/景点名称char introduction200;/景点介绍Vertex;定义一个顶点的结构体,用来储存景点的编号、景点得名称和景点的介绍等关于景点的信息。3.无向图的结构体typedef struct /定义图的数据类型Vertex vexsMAX_VERTEX_NUM;/顶点的结构体AdjMatrix arcs;/边的邻接矩阵int vexnum,arcnum;/顶点的个数,边的个数MGraph;定义一个图的结构体,用来储存顶点的信息、边的信息、顶点的个数和边的个数等相关的信息便于我们以后在用的时候能够方便快捷的调用。定义好这些结构体后,当我们以后需要调用的时候,我们就能够方便快捷的调用这些结构体,从而使得我们在运行程序的时候能够更加的快速能够提高我们的程序的运行效率,大大的节省了我们的时间还使得程序变得更加的简单。4 软件测试4.1 菜单的测试对于菜单函数的测试,首先菜单是一个可示化的界面,它能够提示游客依据显示屏上出现的提示来进行相关的操作,查看所有的景点从而方便游客进行相关的操作,因而我们在运行程序的时候首先就会进入到菜单函数当中,经过测试其能够实现我们所要实现得基本功能,其效果图如图4.1所示:图4.1菜单4.2 查找景点简介的测试对于查找景点的介绍的测试,首先依据显示屏上的提示首先输入要进行的操作输入3进入查找景点信息的操作界面,然后输入需要查找的景点的名称即可显示出景点的介绍信息,经过测试可以得出其没有什么错误,程序能够按照我的要求实现它的功能,其效果图如图4.2所示:图4.2查找景点信息4.3 查找两个景点之间的最短距离的测试同查找景点的信息一样,对于查找景点之间的最短距离的测试,我们就要依据提示输入2进入到查询最短路径的界面,依次输入所需要查找的两个景点就会显示出怎样到达这两个景点并显示出它们之间的最短路径,经过测试可见程序能够按照我的要求来实现其所需要的功能,其效果图如图4.3所示:图4.3查找两个景点之间的最短距离4.4 查看景点分布图的测试对于查看景点分布图的测试,我需要依据显示屏上的提示,需要输入1进入到分布图的界面,系统就会直接调用browse_view_distribute();函数,在屏幕上打印出景点的分布图。图4.4景点分布图界面4.5 退出的测试原理同上,对于退出函数的测试,我需要依据显示屏上的提示,需要输入4进入到退出的界面,系统就会直接调用退出的函数,显示出“欢迎下次继续使用!”的话,退出了系统,其效果图如图4.4所示:图4.5退出界面5 软件使用说明对于软件的使用,对于第一次使用软件的游客来说,要让他们在第一次用的时候就能够快速轻松的掌握软件的用法,因此在程序一开始运行的时候,我们要进行如下的操作:(1)首先我会给游客提供一个可视化的菜单操作界面,在显示屏上提示用户其可以进行的操作和他能够查询的景点的编号、名称。(2)用户输入了“1”后,屏幕上会显示出所有景点的位置关系平面图。能够大致了解景点的分布。(3)当用户输入了“2”后,进入到查询任意两景点间最短路径的界面,然后提示用户依次输入两个景点的编号,程序就会将这两个景点的最短路径给我们表示出来并显示出最短路径是多少。(4)用户输入了“3”后,进入到查询景点信息的界面,然后提示用户输入景点的编号(一次限一个),程序就会显示出这个景点的详细介绍。(5)当用户输入了“4”后,进入到退出界面,这时系统就会显示“欢迎下次继续使用!”的提示语,最后按下任意键退出系统。6 参考文献【1】 数据结构(C语言版) 严蔚敏 吴伟民 编著 清华大学出版社 2002【2】 C程序设计经典教程,美Deitel,H.M.,美Deitel,P.J.著,清华大学出版社 2006【3】 Windows程序设计,美 Charles Petzold 著,北京大学出版社 2004【4】 Data Structures:A Pseudecode(Approach with C)美Richard F.Gilberg,美Behrouz A.Forouzan著7 附录7.1 系统完整代码#define INFINITY 10000 /*无穷大*/#define MAX_VERTEX_NUM 40#define MAX 40#include#include#include#include#include Exit.htypedef struct ArCellint adj; /路径长度ArCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struct /图中顶点表示主要景点,存放景点的编号、名称、简介等信息,char name30;int num;char introduction200;/简介infotype;typedef structinfotype vexsMAX_VERTEX_NUM;/景点AdjMatrix arcs;/路径数组int vexnum,arcnum;/景点数,路径长度记录MGraph;MGraph b;/全局变量 void cmd(void);/在主函数中用来调用其他应用子函数的函数声明MGraph InitGraph(void);/用来构造学校地图的子函数 返回MGraph类型void Menu(void);/菜单函数;void Browser(MGraph *G);/调用MGraph类型的地址,进行void ShortestPath_DIJ(MGraph * G);/迪杰斯特拉算法求最短路径的子函数void Floyd(MGraph *G);/佛洛伊德算法void Search(MGraph *G);/寻找要查询的景点,并输出该景点的信息void browse_view_distribute();/查看景点分布图void tou(MGraph *G);/景点列表void panduan();/void Exit();/退出int LocateVex(MGraph *G,char* v);/定点位置MGraph * CreatUDN(MGraph *G);/初始化图形,接受用户输入void print(MGraph *G);/打印输出子函数/*/void main(void)system(color 1f);/设置调试窗口背景和字体颜色system(mode con: cols=140 lines=130);/设置调试窗口的大小cmd();/用该函数来调用其他需要用到的函数/*/void cmd(void)/用来调用其他需要用到的函数的子函数int i;b=InitGraph();/构造校园地图Browser(&b);/Menu();/调用菜单函数scanf(%d,&i);while(i!=4)switch(i)case 1:system(cls);/*ShortestPath_DIJ(&b);*/browse_view_distribute();Browser(&b);break;case 2:system(cls);tou(&b);Floyd(&b);Browser(&b);break;case 3:system(cls);tou(&b);Search(&b);Browser(&b);break;case 4:exit(0);break;default:break;scanf(%d,&i);printf(欢迎下次继续使用 !nn);/*MGraph InitGraph(void)/构造校园地图MGraph G;int i,j;G.vexnum=13;/景点数量G.arcnum=21;/路径数量for(i=1;i=G.vexnum;i+)G.vexsi.num=i;/对景点进行对应编号 /*对对应的景点编号进行命名,输入简介*/strcpy(G.vexs3.name,行政办公楼); strcpy(G.vexs3.introduction,学校的行政机构。);strcpy(G.vexs6.name,图书馆);strcpy(G.vexs6.introduction,体积庞大,是学校的标志性建筑,目前还在建设中。);strcpy(G.vexs2.name,果园);strcpy(G.vexs2.introduction,枝叶茂盛,各种新鲜水果。); strcpy(G.vexs1.name,校门);strcpy(G.vexs1.introduction,学校的形象,气势宏伟。);strcpy(G.vexs4.name,体育运动区);strcpy(G.vexs4.introduction,包括有排球场、篮球场、网球场等。);strcpy(G.vexs5.name,教学区);strcpy(G.vexs5.introduction,包括左教学楼、小湖、右教学楼、实验楼和医务室等。);strcpy(G.vexs10.name,男生宿舍);strcpy(G.vexs10.introduction,分1、2、7、8栋,供男同学居住,女生勿进。);strcpy(G.vexs7.name,琴房);strcpy(G.vexs7.introduction,音乐学院学生练琴的地方。);strcpy(G.vexs8.name,足球场);strcpy(G.vexs8.introduction,踢球,跑步,运动比赛场地。);strcpy(G.vexs9.name,省高速路);strcpy(G.vexs9.introduction,上面是省高速路,下面是人行隧道。);strcpy(G.vexs11.name,食堂);strcpy(G.vexs11.introduction,分1、2、3、4楼,价格有所不同,根据自己爱好,随意点菜。);strcpy(G.vexs12.name,女生宿舍);strcpy(G.vexs12.introduction,楼下一“爱心”超市,价格绝对不便宜。楼上女同学居住,男生勿进。);strcpy(G.vexs13.name,教师村);strcpy(G.vexs13.introduction,老师们的居住地,10多楼高。);/对有路的各景点之间的路径长度进行设置,没路的设置为无穷大 for(i=1;i=G.vexnum;i+) for(j=1;j=G.vexnum;j+)G.arcsij.adj=INFINITY;G.arcs13.adj=100;G.arcs12.adj=100;G.arcs15.adj=200;G.arcs24.adj=100;G.arcs23.adj=150;G.arcs35.adj=200;G.arcs38.adj=300;G.arcs45.adj=100;G.arcs47.adj=150;G.arcs56.adj=100;G.arcs67.adj=150;G.arcs68.adj=100;G.arcs79.adj=50;G.arcs89.adj=200;G.arcs813.adj=200;G.arcs910.adj=200;G.arcs911.adj=150;G.arcs912.adj=200;G.arcs1011.adj=100;G.arcs1112.adj=150;G.arcs1213.adj=150;/无向图的路径是相互的 for(i=1;i=G.vexnum;i+)for(j=1;j=G.vexnum;j+)G.arcsji.adj=G.arcsij.adj; return G;/InitGraph end/*/*/菜单函数,打印出导游项目菜单void Menu() printf(n 琼州学院校园导游图n);printf( n); printf( 编号 实 现 的 功 能 n);printf( n);printf( 1 查 看 景 点 分 布 图 n);printf( n);printf( 2 查 找 两 景 点 间 最 短 距 离 n);printf( n); printf( 3 查 看 景 点 信 息 n);printf( n); printf( 4 退 出 系 统 n);printf( n);printf(输入你的操作编号:);*/*/输出所有景点信息void Browser(MGraph *G)int v;printf(n);printf(编号景点名称 n);for(v=1;vvexnum;v+)printf(%-4d%-12s,G-vexsv.num,G-vexsv.name); switch(v+2)case 4:printf( 琼州学院校园导游图n);break;case 5:printf( n);break;case 6:printf( 编号 实 现 的 功 能 n);break;case 7:printf( n);break; case 8:printf( 1 查 看 景 点 分 布 图 n);break;case 9:printf( n);break;case 10:printf( 2 查 找 两 景 点 间 最 短 距 离 n);break; case 11:printf( n);break;case 12:printf( 3 查 看 景 点 信 息 n);break;case 13:printf( n);break;case 14:printf( 4 退 出 系 统 n);break;case 15:printf( n);break;default:printf(n);break;printf(n);printf(输入你的操作编号:);/*/*/ 迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点void ShortestPath_DIJ(MGraph * G)int v,w,i,min,t=0,x,flag=1,v0; int final20, D20, p2020;while(flag)printf(请输入一个起始景点编号:);scanf(%d,&v0);if(v0G-vexnum)printf(景点编号不存在!请重新输入景点编号:);scanf(%d,&v0);printf(n);if(v00&v0vexnum)flag=0;for(v=1;vvexnum;v+)finalv=0;Dv=G-arcsv0v.adj;for(w=1;wvexnum;w+)pvw=0;if(DvINFINITY)pvv0=1;pvv=1;Dv0=0;finalv0=1;for(i=1;ivexnum;i+)min=INFINITY;for(w=1;wvexnum;w+)if(!finalw)if(Dwmin)v=w;min=Dw;finalv=1;for(w=1;wvexnum;w+)if(!finalw&(min+G-arcsvw.adjarcsvw.adj;for(x=1;xvexnum;x+) pwx=pvx;pww=1;for(v=1;vvexnum;v+)if(v0!=v) printf(%s,G-vexsv0.name);for(w=v0;w0;w-)pvv0-v=0;if(pvw&w!=v0) printf(-%s,G-vexsw.name);t+;printf(yyyy);for(w=v0-1;wvexnum;w+)if(pvw&w!=v0) printf(-%s,G-vexsw.name);t+;printf(xxxx);if(tG-vexnum-1&v0!=v)printf( 总路线长%dmnn,Dv);/ShortestPath_DIJ end*/*void Floyd(MGraph *G)int v,u,i,w,k,j,flag=1,p141414,D1414;for(v=1;vvexnum;v+)for(w=1;wvexnum;w+)Dvw=G-arcsvw.adj;for(u=1;uvexnum;u+)pvwu=0;if(DvwINFINITY)pvwv=1;pvww=1;for(u=1;uvexnum;u+)for(v=1;vvexnum;v+)for(w=1;wvexnum;w+)if(Dvu+DuwDvw)Dvw=Dvu+Duw;for(i=1;ivexnum;i+)pvwi=pvui | puwi;while(flag)printf(请输入出发点和目的地的编号:);scanf(%d%d,&k,&j);if(kG-vexnum | jG-vexnum)printf(景点编号不存在!请重新输入出发点和目的地的编号:);scanf(%d%d,&k,&j);if(k=j)printf(出发点和目的地一样!请重新输入出发点和目的地的编号:);scanf(%d%d,&k,&j);if(k0 & kvexnum & j0 & jvexnum)flag=0;printf(n最短游览路线:%s,G-vexsk.name);if(kj)for(u=G-vexnum;u0;u-)if(pkju & k!=u & j!=u)printf(-%s,G-vexsu.name);if(kj)for(u=1;uvexnum;u+)if(pkju & k!=u & j!=u)printf(-%s,G-vexsu.name);printf(-%s,G-vexsj.name);printf( 总路线长%dmn,Dkj);/Floyd end/*/寻找要查询的景点,并输出该景点的信息void Search(MGraph *G)int k,flag=1;while(flag)printf(请输入要查询的景点编号:);scanf(%d,&k);if(kG-vexnum)printf(景点编号不存在!请重新输入景点编号:);scanf(%d,&k);if(k0&kvexnum)flag=0;printf(nn);printf(编号景点名称 简介 n);printf(%-4d%-16s%-62sn,G-vexsk.num,G-vexsk.name,G-vexsk.introduction);printf(n);/Search end/*int LocateVex(MGraph *G,char* v) int c=-1,i;for(i=1;ivexnum;i+)if(strcmp(v,G-vexsi.name)=0)c=i;break;return c;/*MGraph * CreatUDN(MGraph *G)/初始化图形,接受用户输入int i,j,k,w;char v120,v220;printf(请输入图的顶点数,弧数:);scanf(%d%d,&G-vexnum,&G-arcnum);printf(请输入景点的编号:、名称、简介:n);for(i=1;ivexnum;i+)printf(景点编号:);scanf(%d,&G-vexs-num);printf(景点名称:);scanf(%s,G-vexsi.name);printf(景点简介:);scanf(%s,G-vexs-introduction);for(i=1;ivexnum;i+)for(j=1;jvexnum;j+)G-arcsij.adj=INFINITY;printf(请输入路径长度:n);for(k=1;karcnum;k+)printf(第%d条边:n,k+1);printf(景点对(x,y):);scanf(%s,v1);scanf(%s,v2);printf(路径长度:);scanf(%d,&w);i=LocateVex(G,v1);j=LocateVex(G,v2);if(i0 & j0)G-arcsij.adj=w;G-arcsji=G-arcsij; return G;/*void browse_view_distribute()/查看景点分布图,3printf(n);printf(
展开阅读全文