数据结构课程设计报告-校园导游程序_第1页
数据结构课程设计报告-校园导游程序_第2页
数据结构课程设计报告-校园导游程序_第3页
数据结构课程设计报告-校园导游程序_第4页
数据结构课程设计报告-校园导游程序_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z课 程 设 计 说 明 书课程名称数据构造课程设计设计课题校园导游程序专业计算机科学与技术班级*完成日期课 程 设 计 任 务 书设计题目:校园导游程序设计容与要求:问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够答复有关景点介绍、游览路径等问题。根本要求 1 查询各景点的相关信息;2 查询图中任意两个景点间的最短路径。3 查询图中任意两个景点间的所有路径。4 增加、删除、更新有关景点和道路的信息。 指导教师:2016年 12月 20日课 程 设 计 评 语 成绩: 指导教师:

2、_ 年 月 日-. z目录TOC o 1-3 h z uHYPERLINK l _Toc470807539一、问题描述 PAGEREF _Toc470807539 h 1HYPERLINK l _Toc470807540二、根本要求 PAGEREF _Toc470807540 h 1HYPERLINK l _Toc470807541三、测试数据 PAGEREF _Toc470807541 h 2HYPERLINK l _Toc470807542四、算法思想 PAGEREF _Toc470807542 h 3HYPERLINK l _Toc470807543五、模块划分 PAGEREF _Toc

3、470807543 h 4HYPERLINK l _Toc4708075445.1应用函数 PAGEREF _Toc470807544 h 4HYPERLINK l _Toc470807545主函数 PAGEREF _Toc470807545 h 5HYPERLINK l _Toc470807546查询景点信息函数 PAGEREF _Toc470807546 h 6HYPERLINK l _Toc470807547查询两景点之间最短路径函数 PAGEREF _Toc470807547 h 6HYPERLINK l _Toc470807548查询两景点之间所有路径函数 PAGEREF _Toc4

4、70807548 h 7HYPERLINK l _Toc470807549删除已有的顶点和路径 PAGEREF _Toc470807549 h 8HYPERLINK l _Toc470807550修改已有的顶点和路径 PAGEREF _Toc470807550 h 9HYPERLINK l _Toc470807551六、数据构造 PAGEREF _Toc470807551 h 10HYPERLINK l _Toc470807552七、测试 PAGEREF _Toc470807552 h 11HYPERLINK l _Toc470807553八、心得 PAGEREF _Toc470807553

5、h 19HYPERLINK l _Toc470807554九、源程序 PAGEREF _Toc470807554 h 20-. z问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够答复有关景点介绍、游览路径等问题。二、 根本要求1 查询各景点的相关信息;2 查询图中任意两个景点间的最短路径。3 查询图中任意两个景点间的所有路径。4 增加、删除、更新有关景点和道路的信息。三、 测试数据菜单函数:依次输入:1,2,3,4,5,6,0 分别对应景点信息查询,最短路径查询,所有路径查询,添加景点

6、及路径信息,删除景点及路径信息,修改景点及路径信息,退出。查询景点信息:输入:1,2分别对应按编号查询,按景点名称查询按编号查询:输入编号:1按景点名称查询:输入名称:大明桥最短路径查询:输入起始景点和终点景点编号:1,7所有路径查询:输入起始景点和终点景点编号:2,8添加景点及路径信息:输入新景点序号:9输入新景点名称:南门 输入新景点相关信息:充满古韵的门,适合拍照 输入到其余各景点的距离:50,100,20删除景点及路径信息:输入:1,2分别对应按编号查询,按景点名称查询按编号查询:输入需要删除的景点编号:8修改景点及路径信息:输入:1,2分别对应修改景点信息,修改道路信息修改景点信息:

7、输入1,2分别对应修改景点名称,修改景点描述修改景点信息:输入修改序号:1 输入修改后的名称:图书馆123-. z四、算法思想先利用CreateUDN 创立初始无向网,通过main主函数调用显示,操作功能的选择通过Menu函数输出,根据游客需求选择景点信息查询、景点之间最短路径查询、景点之间所有路径查询、添加景点信息、删除景点信息或者修改信息。如果是景点信息查询, 在search中完成,再调用SearchMenu选择是按照景点编号或者景点名称查询,游客输入相应容。如果是景点之间最短路径查询或是景点之间所有路径查询则游客输入起始景点和完毕景点;最短路径是用ShortestPath实现,其中运用了

8、迪杰斯特拉算法;所有路径由Searchpath1调用disppath再调用path,在path过递归算法实现寻找每一条路并输出。如果是添加景点信息调用Addnewsight函数,游客按照提示依次输入信息容。如果是删除景点信息,选择按照名称删除或是按照序号删除,再调用Deletesight函数,游客输入相应容进展删除。如果是修改信息,调用Changesight,Changemenu两个函数,游客按提示选择修改景点信息或者道路信息,再按提示输入修改后得容。输出使用调用的相应函数。信息保存于文件中。校园导游图添加景点和路径查询所有路径查询最短路径修改景点和路径修改路径修改景点删除景点和路径按编号按名

9、称查询景点信息按编号按名称修改名称修改描述五、 模块划分5.1应用函数void CreateUDN(int v,int a); /* 造图函数 */void narrate(); /*说明函数*/void ShortestPath(int num); /*最短路径函数*/void output(int sight1,int sight2); /*输出函数*/int Menu(); /* 主菜单 */void search(); /* 查询景点信息 */int SearchMenu(); /* 查询子菜单 */void HaMiTonian(int); /* 图的遍历 */void Search

10、path1(MGraph g); /*查询两个景点间的所有路径*/void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k);/*确定路径上第k+1个顶点的序号*/void Ne*tValue(int); void display(); /* 显示遍历结果 */int Addnewsight(int n); /*添加新的景点和路径*/int Deletesight(); /*删除景点和路径*/void Changesight(); /*修改景点和路径*/int Changemenu(); /*修改路径或顶点

11、的选择菜单*/int Sightmenu(); /*选择需该景点的菜单*/5.2.1主函数1.功能:初始图通过main主函数调用显示,操作功能的选择通过Menu函数输出,显示为菜单形式提醒用户进展操作,用户选择后在main主函数中调用各个函数实现各种功能。2.流程图:6101432151 输入相应序号 完毕 开场查询信息删除信息所有路径添加信息最短路径修改信息退出景点信息和操作目录5.2.2查询景点信息函数1.功能:在main主函数中调用search,翻开存储了信息的文件,在显示界面显示已有的景点名称和序号,游客按需求进展序号查询或者名称查询,输入需要查询的序号或者名称后会显示该景点的名称及简

12、介,而后按任意键返回上级菜单项选择择继续查询或者返回主界面,在查询景点信息函数中实现。2.流程图:noyes21 开场按编号查询按景点查询 完毕 输入相关信息是否有此景点?没有找到! 输出景点信息5.2.3查询两景点之间最短路径函数1.功能:在main函数中调用narrate函数,翻开存储了信息的文件,游客输入起点编号或者终点编号,利用迪杰斯特拉算法由ShortestPath最短路径函数 选择一条两点之间的最短路径展示给游客,关闭文件。5.2.4查询两景点之间所有路径函数1.功能:当游客输入完毕后,根据之前构建的无向图,执行过程为进层和退层两个阶段。首先开场递归进层,考虑使用基于深度优先思想,

13、在搜素过程中,按照景点编号大小依次每一个节点,假设到一个未被且有路径相通的点则将其参加数组P,直到找到目的地,输出第一条路径,然后开场递归退层,按照之前的方式递归它的所有未被的相邻节点。并通过相应的设置标志visited的方式使最终能不重复地走遍所有的简单路径。最后输出这些路径即可。5.2.5添加新的顶点和路径1.功能:在Addnewsight添加新的景点和路径函数 中实现,翻开存储了信息的文件,输入需要新添加的景点名称,根本信息介绍并依次输入它到原有各景点的距离,将新信息存储到文件中并保存。5.2.6删除已有的顶点和路径1.功能:删除不需要的景点信息,并保存删除后的文件,方便下一次浏览。2流

14、程图:21no 完毕 是否有此景点?输入需要删除的景点删除成功没有找到yes 开场按景点编号按景点名称5.2.7修改已有的顶点和路径1.功能:修改有误的景点信息,并保存修改后的文件,方便下一次浏览。2流程图:221221 开场修改道路信息 完毕 输入相关信息修改景点信息 输入道路信息 输入景点编号修改景点名称修改景点描述 输入相关信息六、 数据构造MGraph定义图的类型 ,其中包含景点,景点之间的距离,景点数和边数。Verte*Type是景点的构造体,里面包含了景点编号,景点名称,景点描述。ArcCell是边的构造体,其中包含了边的长度即景点之间的距离。typedef struct ArcC

15、ellint adj; /* 相邻接的景点之间的路程 */ArcCell; /* 定义边的类型 */typedef struct Verte*Typeint number; /* 景点编号 */char sight100; /* 景点名称 */ char description1000; /* 景点描述 */Verte*Type; /* 定义顶点的类型 */typedef structVerte*Type ve*20; /* 图中的顶点,即为景点 */ArcCell arcs2020; /* 图中的边,即为景点间的距离 */int ve*num,arum; /* 顶点数,边数 */MGraph

16、; /* 定义图的类型 */七、 测试7.1.测试数据输入:根据游客需求选择景点信息查询、景点之间最短路径查询、景点之间所有路径查询、添加景点信息、删除景点信息或者修改信息。如果是景点信息查询,再选择是按照景点编号或者景点名称查询,游客输入相应容;如果是景点之间最短路径查询或是景点之间所有路径查询则游客输入起始景点和完毕景点;如果是添加景点信息则按照提示依次输入信息容;如果是删除景点信息,选择按照名称删除或是按照序号删除,再输入相应容进展删除;如果是修改信息,按提示选择修改景点信息或者道路信息,再按提示输入修改后得容预期的输出结果:运行程序直接出现各景点及其编号,同时出现操作菜单,其他结果依使

17、用者需求而定,请参见程序后的运行结果。菜单函数2.查询景点信息按编号3.查询景点信息按名称4.查询两景点之间的最短路径5.查询两点之间的所有路径6.添加新的景点及其路径添加过程添加后7.删除景点删除过程删除后8.修改景点信息修改后9.文件容八、 心得通过对这次对校园导游系统程序编写,我切实体会到了如何编写一个较大的程序。这是我自己相对独立做的最大的一个程序,过程中遇到了各种各样的问题。但同时稳固了课堂上所学的知识,也学到了很多新的东西,也收获了很多。 拿到题目,第一步就是构思,分析,创立。题目要求用无向网完成,所以我考虑的是用邻接矩阵存储这个无向网,参考了书上的无向网的邻接矩阵存储程序写了Cr

18、eatUDN。查询两个景点之间的最短路径刚开场我参考的是书上的迪杰斯特拉算法,后来发现书上定义的顶点的构造体数组容太简单,程序考虑的情况也很简单,无法满足我题目的需求,于是我又把迪杰斯特拉算法研读了一遍,自己做了改良。查找所有路径的Searchpath1函数刚开场一直没有写出来,我和同学先在纸上画出顶点,参考深度优先遍历把整个路径走了一遍,但是编程没有什么思路,上网查找了关于这个算法的资料,看到有人说可以考虑用递归实现,就试着用递归实现,同时参照迪杰斯特拉算法用一个数组收集过的顶点,还设置了一个标志量标记顶点是否被。文件在上学期的课设中我写过,当时学习了一些关于文件的知识,所以运用并没有遇到太

19、多问题,利用文件保存数据,需要fopen翻开文件进展读写,还要fclose函数进展关闭操作,可能还会用到fread读取文件。后来知道a+可以继续录入,于是我通过参加一个a+形式的语句,实现了可不定时地增加景点数据的功能所有框架写查找、删除、修改和添加函数本身并不太难,写好以后用main函数调用可以了。写出框架后,刚开场运行也是没什么问题的,但是多做几步就遇到了问题。在添加的时候,刚开场没有考虑序号,程序自动生成的序号和我想。要的并不是一种,于是我在添加景点里面让游客自己输入序号。后来又发现删除没有考虑找不到需要删除的目标的可能性,用一个判断符a来判断是否删除成功。接下来整个运行都没有错但是如果

20、删除两个景点就会出现问题了,试了很久发现是循环条件有问题,虽然固定了景点编号number,但是循环的num和number不能对应,于是去询问教师,教师说可以把整个邻接矩阵重新修改或者设置特殊符号控制输出,我选择了相对简便的修改方法。这个程序很长,编写花了很多时间,在程序编写过程中,我不断遇到困难,调试时更是出现了很多问题,一个个的修改,有的花了很长的时间。但我的努力和辛苦没有白费,在教师的指导,同学的帮助,和自己的努力下我终于完成了这个程序。很感教师最后的点睛之笔,在我和同学冥思苦想很长时间都没有解决方案的时候是教师帮助我们解决了问题。同时也反映出我思考问题的不全面和经历的欠缺。 在程序编写和

21、解决问题时,每一个细节都很重要,既要防止功能的重复也要防止功能疏漏的地方。理论和实践相结合是学好数据构造的关键,这次的课设既培养了我们的自学能力,也提高了我们的学习兴趣。九、 源程序#include #include #include #include #define Ma* 20000typedef struct ArcCellint adj; /* 相邻接的景点之间的路程 */ArcCell; /* 定义边的类型 */typedef struct Verte*Typeint number; /* 景点编号 */ char sight100; /* 景点名称 */ char descript

22、ion1000; /* 景点描述 */Verte*Type; /* 定义顶点的类型 */typedef structVerte*Type ve*20; /* 图中的顶点,即为景点 */ ArcCell arcs2020; /* 图中的边,即为景点间的距离 */ int ve*num,arum; /* 顶点数,边数 */MGraph; /* 定义图的类型 */FILE *fp,*count ; /*变量类型声明,声明fp是FILE型指针,用于指向file类型 */MGraph G; /* 把图定义为全局变量 */char nameofschool100; /*学校名称*/ int NUM=9;i

23、nt P2020; /* 用来存放图中的边 */int p20; /*全局数组,用来存放路径上的各顶点*/int visited20; /*全局数组,用来记录各顶点被的情况*/int a=0; /*全局变量,用来记录每对顶点之间的所有路径的条数*/long int D20; /* 辅助变量存储最短路径长度 */void CreateUDN(int v,int a); /* 造图函数 */void narrate(); /*说明函数*/void ShortestPath(int num); /*最短路径函数*/void output(int sight1,int sight2); /*输出函数*

24、/int Menu(); /* 主菜单 */void search(); /* 查询景点信息 */int SearchMenu(); /* 查询子菜单 */void HaMiTonian(int); /* 图的遍历 */void Searchpath1(MGraph g); /*查询两个景点间的所有路径*/void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k); /*确定路径上第k+1个顶点的序号*/void Ne*tValue(int); void display(); /* 显示遍历结果 */int

25、 Addnewsight(int n); /*添加新的景点和路径*/int Deletesight(); /*删除景点和路径*/void Changesight(); /*修改景点和路径*/int Changemenu(); /*修改路径或顶点的选择菜单*/int Sightmenu(); /*选择需该景点的菜单*/void main() /* 主函数 */ int v0,v1; int ck; CreateUDN(NUM,11); do ck=Menu(); switch(ck)case 1: search(); break; case 2:system(cls);narrate(); pr

26、intf(nnttt请选择起点景点0%d:,NUM-1); scanf(%d,&v0); printf(ttt请选择终点景点0%d:,NUM-1); scanf(%d,&v1); ShortestPath(v0); /* 计算两个景点之间的最短路径 */ output(v0,v1); /* 输出结果 */ printf(nntttt请按任意键继续.n); getchar(); getchar();break; case 3:system(cls); narrate(); Searchpath1(G); printf(nntttt请按任意键继续.n); getchar(); getchar();

27、 break;case 4: system(cls); narrate(); NUM=Addnewsight(NUM); system(cls); narrate(); break;case 5: NUM=Deletesight(); break;case 6:Changesight(); break;while(ck!=0); int Menu() /* 主菜单 */ int c; int flag; do flag=1; system(cls); narrate(); printf(ntttn); printf(tttn); printf(ttt 1、查询景点信息 n); printf(t

28、tt 2、查询两景点间最短路径 n); printf(ttt 3、查询两景点间所有路线 n); printf(ttt 4、添加新的景点和路径 n); printf(ttt 5、删除已有景点和路径 n); printf(ttt 6、修改已有景点或路径 n); printf(ttt 0、退出 n); printf(tttn); printf(tttn); printf(tttt请输入您的选择:); scanf(%d,&c); if(c=1|c=2|c=3|c=4|c=5|c=6|c=0) flag=0; while(flag); return c;int SearchMenu() /* 查询子菜单

29、函数 */ int c; int flag; do flag=1; system(cls); narrate(); printf(ntttn); printf(tttn); printf(ttt 1、按照景点编号查询 n); printf(ttt 2、按照景点名称查询 n); printf(ttt 0、返回 n); printf(tttn); printf(tttn); printf(tttt请输入您的选择:); scanf(%d,&c); if(c=1|c=2|c=0) flag=0; while(flag); return c;void search() /* 查询景点信息函数 */ in

30、t num; int i; int c; char name20; fp=fopen(guide.t*t,r+); /*读翻开原文件book.t*t*/ count=fopen(count.t*t,r+); /*读写count文件*/ do system(cls); c=SearchMenu(); switch (c) case 1: system(cls); narrate(); printf(nntt请输入您要查找的景点编号:); scanf(%d,&num); for(i=0;iNUM;i+) if(num=G.ve*i.number) printf(nnttt您要查找景点信息如下:);

31、 printf(nnttt%s: %-25snn,G.ve*i.sight,G.ve*i.description); printf(nttt按任意键返回.); getchar(); getchar(); break; if(i=NUM) printf(nnttt没有找到!); printf(nnttt按任意键返回.); getchar(); getchar(); break; case 2: system(cls); narrate(); printf(nntt请输入您要查找的景点名称:); scanf(%s,name); for(i=0;iNUM;i+) if(!strcmp(name,G.

32、ve*i.sight) printf(nnttt您要查找景点信息如下:); printf(nnttt%s:%-25snn,G.ve*i.sight,G.ve*i.description); printf(nttt按任意键返回.); getchar(); getchar(); break; if(i=NUM) printf(nnttt没有找到!); printf(nnttt按任意键返回.); getchar(); getchar(); break; while(c!=0); fwrite(&G,sizeof(MGraph),1,fp); /*保存到文件中*/ fclose(fp); fprint

33、f(count,%d,NUM); fclose(count);void CreateUDN(int v,int a) /* 创立初始图函数 */ int i,j; if(fp=fopen(guide.t*t,a+)=NULL) /调用了fopen,要用fclose关闭 ticket文件保存记录的详细信息 printf(文件未找到n); if(count=fopen(count.t*t,w+ )=NULL) /count文件保存记录的条数 fprintf(count,0); else fscanf(count,%d,&NUM); strcpy(nameofschool,理工学院开元校区); G.

34、ve*num=v; /* 初始化构造中的景点数和边数 */ G.arum=a; for(i=0;i20;+i) G.ve*i.number=i; /* 初始化每一个景点的编号 */ /* 初始化每一个景点名及其景点描述 */ strcpy(G.ve*0.sight,大明桥); strcpy(G.ve*0.description,落于小河上,风景优美); strcpy(G.ve*1.sight,图书馆); strcpy(G.ve*1.description,环境优雅,充满书香气息,呈环形); strcpy(G.ve*2.sight,教学楼); strcpy(G.ve*2.description,

35、上课和自习的地方,临近图书馆); strcpy(G.ve*3.sight,子衿餐厅); strcpy(G.ve*3.description,一餐厅,新装修过的餐厅,临近实验楼,是男女比例最适中的餐厅); strcpy(G.ve*4.sight,实验A楼); strcpy(G.ve*4.description,教师办公室); strcpy(G.ve*5.sight,实验B楼); strcpy(G.ve*5.description,计算机机房); strcpy(G.ve*6.sight,实验C楼); strcpy(G.ve*6.description,电气实验楼); strcpy(G.ve*7.s

36、ight,璞院餐厅); strcpy(G.ve*7.description,第二餐厅,临近男生宿舍,食物种类比拟多); strcpy(G.ve*8.sight,琇院餐厅); strcpy(G.ve*8.description,第三餐厅,临近女生宿舍楼,比拟廉价); /* 这里把所有的边假定为20000,含义是这两个景点之间是不可到达,极大值 */ for(i=0;i20;+i) for(j=0;j20;+j) G.arcsij.adj=Ma*; /* 下边是可直接到达的景点间的距离,由于两个景点间距离是互相的, 所以要对图中对称的边同时赋值。 */ G.arcs01.adj=G.arcs10.

37、adj=50; G.arcs13.adj=G.arcs31.adj=70; G.arcs06.adj=G.arcs60.adj=250; G.arcs14.adj=G.arcs41.adj=80; G.arcs24.adj=G.arcs42.adj=100; G.arcs35.adj=G.arcs53.adj=90; G.arcs52.adj=G.arcs25.adj=100; G.arcs46.adj=G.arcs64.adj=75; G.arcs47.adj=G.arcs74.adj=300; G.arcs27.adj=G.arcs72.adj=400; G.arcs78.adj=G.ar

38、cs87.adj=40; fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中fclose(fp); /关闭文件,但不是屏幕fprintf(count,%d,NUM); fclose(count); void narrate() /* 说明函数 */ int i; printf(nt*欢送使用%s校园导游程序*n,nameofschool); printf(t_n); printf(tttt 景点名称ttttttn); printf(ttt_n); for(i=0;iNUM;i+) if(G.ve*i.number!=-1) printf(tttt%c (%2d)%-

39、10s%cn,3,G.ve*i.number,G.ve*i.sight,3); /* 输出景点列表 */ printf(ttt_n);void ShortestPath(int num) /* 迪杰斯特拉算法最短路径函数 num为入口点的编号 */ int v,w,i,t; /* i、w和v为计数辅助变量 */ int final20; /* 辅助数组 */ int min; fp=fopen(guide.t*t,r+); /读翻开原文件book.t*t count=fopen(count.t*t,r+); /读写count文件 for(v=0;vNUM;v+) finalv=0; /* 假设

40、从顶点num到顶点v没有最短路径 */ Dv=G.arcsnumv.adj;/* 将与之相关的权值放入D中存放 */ for(w=0;wNUM;w+) /* 设置为空路径 */ Pvw=0; if(Dv20000) /* 存在路径 */ Pvnum=1; /* 存在标志置为1 */ Pvv=1; /* 自身到自身 */ Dnum=0; finalnum=1; /* 初始化num顶点属于S集合 */ /* 开场主循环,每一次求得num到*个顶点的最短路径,并将其参加到S集合 */ for(i=0;iNUM;+i) /* 其余G.ve*num-1个顶点 */ min=Ma*; /* 当前所知离顶点

41、num的最近距离 */ for(w=0;wNUM;+w) if(!finalw) /* w顶点在v-s中 */ if(Dwmin) /* w顶点离num顶点更近 */ v=w; min=Dw; finalv=1; /* 离num顶点更近的v参加到s集合 */ for(w=0;wNUM;+w) /* 更新当前最短路径极其距离 */ if(!finalw&(min+G.arcsvw.adj)Dw)/* 不在s集合,并且比以前所找到的路径都短就更新当前路径 */ Dw=min+G.arcsvw.adj; for(t=0;tNUM;t+) Pwt=Pvt; Pww=1; fwrite(&G,sizeo

42、f(MGraph),1,fp); /保存到文件中 fclose(fp); fprintf(count,%d,NUM); fclose(count);void output(int sight1,int sight2) /* 输出函数 */int a,b,c,d,q=0; a=sight2; /* 将景点二赋值给a */ if(a!=sight1) /* 如果景点二不和景点一输入重合,则进展. */printf(nt从%s到%s的最短路径是,G.ve*sight1.sight,G.ve*sight2.sight);/* 输出提示信息 */ printf(t(最短距离为 %dm.)nnt,Da);

43、 /* 输出sight1到sight2的最短路径长度,存放在D数组中 */ printf(t%s,G.ve*sight1.sight); /* 输出景点一的名称 */ d=sight1; /* 将景点一的编号赋值给d */ for(c=0;cNUM;+c) gate:; /* 标号,可以作为goto语句跳转的位置 */ Pasight1=0; for(b=0;bNUM;b+) if(G.arcsdb.adj%s,G.ve*b.sight); /* 输出此节点的名称 */ q=q+1; /* 计数变量加一,满8控制输出时的换行 */ Pab=0; d=b; /* 将b作为出发点进展下一次循环输出

44、,如此反复 */ if(q%8=0) printf(n); goto gate; /*从当前位置出发*/ void Searchpath1(MGraph g)/*查询两个景点间的所有路径*/int l=0;int k=0;int i,j;fp=fopen(guide.t*t,r+);/读翻开原文件book.t*tcount=fopen(count.t*t,r+);/读写count文件 printf(选择出发景点:); scanf(%d,&i); printf(选择目地景点:); scanf(%d,&j); for(;kg.ve*num;k+)/*g.ve*number表示网中的顶点个数*/ i

45、f(i=g.ve*k.number) i=k;/*在网中找到其编号与输入的出发景点的编号一样的顶点*/ for(;lg.ve*num;l+) if(j=g.ve*l.number) j=l;/*在网中找到其编号与输入的目地景点的编号一样的顶点*/ printf(n从%s到%s的所有游览路径有:nn,g.ve*i.sight,g.ve*j.sight);/*输出出发景点和目地景点的名称*/disppath(g,i,j);/*调用disppath函数,用来输出两个景点间的所有路径*/ fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中 fclose(fp); fprin

46、tf(count,%d,NUM); fclose(count);void disppath(MGraph g,int i,int j) int k;p0=i; /把i赋给P0,P是一条道路上的所有景点的数组for(k=0;kg.ve*num;k+)visitedi=0;/*初始化各顶点的标志位,即都为未过的*/a=0;/*初始化路径的条数*/path(g,i,j,0);/*通过调用path函数,找到从vi到vj的所有路径并输出*/void path(MGraph g,int i,int j,int k)/*确定路径上第k+1个顶点的序号*/int s;if(pk=j)/*找到一条路径*/a+;

47、/*路径的条数值加1*/printf(第%d条:t,a);for(s=0;s);/coutg.ve*ps.sight;printf(%sn,g.ve*ps.sight); s=0; /从第一个景点开场while(sg.ve*num)if(s!=i)/*保证找到的是简单路径*/if(g.arcspks.adj!=Ma*&visiteds=0)/*当vk与vs之间有边存在且vs未被过*/visiteds=1;/*置标志位为1,即已的*/pk+1=s;/*将顶点s参加到p数组中*/ path(g,i,j,k+1);/*递归调用之*/ visiteds=0;/*重置标志位为0,即未的,以便该顶点能被重

48、新使用*/s+; int Addnewsight(int n) /添加函数int i,b;char sight100,description1000;int length; fp=fopen(guide.t*t,r+);/读翻开原文件book.t*tcount=fopen(count.t*t,r+);/读写count文件 printf(请输入新景点的序号:n);scanf(%d,&b);printf(请输入新景点的名称:n);scanf(%s,&sight);printf(请输入新景点的相关信息:n);scanf(%s,&description);G.ve*n.number=b;strcpy(

49、G.ve*n.sight,sight); strcpy(G.ve*n.description,description);for(i=0;in;i+) system(cls); narrate();printf(请输入此景点到第%d个景点的距离单位:m同一景点或不可到达用20000表示,极大值:n,i);scanf(%d,&length);if(length!=20000);G.arum+;G.arcsni.adj=G.arcsin.adj=length;NUM+;n+;G.ve*num+; fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中 fclose(fp);

50、fprintf(count,%d,NUM); fclose(count);return n;int Deletesight(int n) /*删除函数*/ int i,a=0;int j;int c;int num;char name20;system(cls); fp=fopen(guide.t*t,r+);/读翻开原文件book.t*tcount=fopen(count.t*t,r+);/读写count文件 c=SearchMenu(); switch (c) case 1: system(cls); narrate(); printf(nntt请输入您要删除景点的编号:); scanf(

51、%d,&num); for(i=0;iNUM;i+) if(num=G.ve*i.number) /查找到编号 a=1;for(j=0;jNUM;j+)if(G.arcsij.adj!=20000)G.arum-; /如果该顶点与其他顶点间有边相连,边数减一 G.arcsij.adj=G.arcsji.adj=20000; /将该顶点与其他顶点间的距离初始化为无穷大20000) G.ve*num.number=-1; /从要删除的顶点之后的顶点开场,向前覆盖 即删除操作strcmp(G.ve*num.sight,*); strcmp(G.ve*num.description,+); if(a=

52、1) printf(nttt删除成功!按任意键返回.);getchar(); getchar(); if(a=0)printf(该编号不存在!); getchar(); getchar(); break; case 2: system(cls); narrate(); printf(nntt请输入您要删除景点的名称:); scanf(%s,name); for(i=0;iNUM;i+) if(!strcmp(name,G.ve*i.sight) a=1; num=i; for(j=0;jNUM;j+) if(G.arcsij.adj!=20000) G.arum-;G.arcsij.adj=G.arcsji.adj=20000; G.ve*num.number=-1; /从要删除的顶点之后的顶点开场,向前覆盖 即删除操作 strcmp(G.ve*num.sight,*); strcmp(G.ve*num.description,+); if(a=1) printf(删除成功!); printf(nttt按任意键返回.); getchar()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论