问题描述: 创建一个至少有15个点的有向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:天地广场门,十八盘,冯玉祥墓,桃花峪门,中天门,南天门,玉皇顶等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。1。基本要求 (1)创建图的存储结构。 (2)输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道); (3)输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出两景点不可达的信息。2。重点、难点 重点: (1)通过实验掌握图状结构数据的存储与表式; (2)通过实验掌握对图的存储、遍历、运算等各种操作; (3)深入理解图的特征及应用; 难点: (1)任意两个景点所有路径的计算; (2)最短路径的计算与算法设计。 代码示例:includestdio。hincludestdlib。hincludestring。hincludetime。hdefineN15defineMAX999intminlen〔N〕;introute〔N〕〔N〕;intvisited〔N〕;intflag〔N〕;intstack〔N〕;intpath〔N〕〔N〕;inttemp〔N〕〔N〕;intstart99,end99;intv,w,m1;intstaticn0;typedefstruct{charname〔N〕〔20〕;intlength〔N〕〔N〕;charway〔N〕〔N〕;}Pvoidinitpath(){inti,k;for(i0;iN;i){path〔i〕〔0〕path〔i〕〔1〕i;for(k2;kN;k)path〔i〕〔k〕999;}}voidreadfile(Pointinfo){inti0,j;charch〔N〕〔10〕;FILEfp1,fp2,fp3;if((fp1fopen(viewname。txt,r))NULL){printf(Openfailed!!!);exit(0);}if((fp2fopen(viewlength。txt,r))NULL){printf(cannotopenfile!);exit(0);}if((fp3fopen(viewway。txt,r))NULL){printf(cannotopenfile!);exit(0);}for(i0;iN;i)fscanf(fp1,s,infoname〔i〕);fclose(fp1);for(i0;iN;i){for(j0;jN;j){fscanf(fp2,d,infolength〔i〕〔j〕);temp〔i〕〔j〕infolength〔i〕〔j〕;}}fclose(fp2);for(i0;iN;i){for(j0;jN;j)fscanf(fp3,c,infoway〔i〕〔j〕);}fclose(fp3);}voidoutputview(Pointinfo){inti,j;printf(一共有d个景点,关系如下:,N);for(i0;iN;i)printf(7s,infoname〔i〕);printf();for(i0;iN;i)for(j0;jN;j){if(j0)printf(3s,infoname〔i〕);if(j!N)printf(4d(c),infolength〔i〕〔j〕,infoway〔i〕〔j〕);elseprintf();}}voidDijkstra(Pointinfo){inti1,j,for(v0;vN;v)循环初始化{flag〔v〕0;minlen〔v〕infolength〔start〕〔v〕;for(w0;wN;w)route〔v〕〔w〕0;设空路径if(minlen〔v〕MAX){route〔v〕〔start〕1;route〔v〕〔v〕1;}}minlen〔start〕0;flag〔start〕0;初始化start顶点属于集合Sfor(i1;iN;i)开始主循环每次求得v0到某个顶点v的最短路径并加v到集合S中{minMAX;for(w0;wN;w)if(!flag〔w〕)如果w顶点在VS中{这个过程最终选出的点应该是选出当前VS中与S有关联边且权值最小的顶点书上描述为当前离start最近的点if(minlen〔w〕min){minminlen〔w〕;}}flag〔v〕1;选出该点后加入到合集S中for(w0;wN;w)更新当前最短路径和距离{if(!flag〔w〕(mininfolength〔v〕〔w〕minlen〔w〕)){for(j0;jN;j)path〔w〕〔j〕path〔v〕〔j〕;for(j0;jN;j)if(path〔w〕〔j〕999){path〔w〕〔j〕w;}minlen〔w〕mininfolength〔v〕〔w〕;route〔w〕〔w〕1;}}}}voidDFS(Pointinfo,intp){inti,j,visited〔p〕1;for(i0;iN;i){if(infolength〔p〕〔i〕!MAX){if(iend){n;printf(第d条:,n);for(j0;j){stack〔m〕printf((d,s,c),stack〔j〕1,infoname〔stack〔j〕〕,infoway〔stack〔j〕〕〔stack〔j1〕〕);printf((s)c,infoname〔stack〔j〕〕,infoway〔stack〔j〕〕〔stack〔j1〕〕);}printf(d(s),end1,infoname〔end〕);printf((s),infoname〔end〕);}elseif(!visited〔i〕){infolength〔p〕〔i〕MAX;visited〔i〕1;stack〔m〕i;m;DFS(info,i);infolength〔p〕〔i〕temp〔p〕〔i〕;visited〔i〕0;m;}}}}voidreceive(Pointinfo){chara〔20〕,b〔20〕;printf(输入起点和终点标号,按退出:);scanf(ss,a,b);printf(得出所有简单路径和最短路径);if(strcmp(a,)0strcmp(b,)0)for(i0;iN;i){if(strcmp(a,infoname〔i〕)0)if(strcmp(b,infoname〔i〕)0)}initpath();for(i0;iN;i)printf(d,minlen〔i〕);if(start99end99)printf(输入错误,请重新输入景点名);else{Dijkstra(info);for(i0;iN;i)printf(d,minlen〔i〕);printf(ddd,start,end,minlen〔end〕);if(minlen〔end〕!MAX){printf(景点s到景点s最短路径长度为:d所有简单路径:,infoname〔start〕,infoname〔end〕,minlen〔end〕);for(i0;iN;i)visited〔i〕0;stack〔0〕DFS(info,start);printf(一共有d条路径!,n);printf(景点s到景点s最短路径长度为:d,infoname〔start〕,infoname〔end〕,minlen〔end〕);printf(最短路径为:);for(i0;iN;i){if(path〔end〕〔i1〕999)printf((d,s)c,path〔end〕〔i〕1,infoname〔path〔end〕〔i〕〕,infoway〔path〔end〕〔i〕〕〔path〔end〕〔i1〕〕);printf((s)c,infoname〔path〔end〕〔i〕〕,infoway〔path〔end〕〔i〕〕〔path〔end〕〔i1〕〕);}printf(d(s),path〔end〕〔i〕1,infoname〔path〔end〕〔i〕〕);printf((s),infoname〔path〔end〕〔i〕〕);}else{printf(非常抱歉!!!景点s无法到达s,infoname〔start〕,infoname〔end〕);}printf();}startend99;n0;}intmain(){inti,j0;PointviewinfoNULL;viewinfo(Point)malloc(sizeof(Point));readfile(viewinfo);msgbox(viewinfo);printf(输入操作:);while(scanf(c,x)!EOF){switch(x){caseS:msgbox(viewinfo);receive(viewinfo);printf(输入操作:);caseE:exit(0);default:cursys();msgbox(viewinfo);printf(输入操作:);}}printf(谢谢使用!!!);} 写在最后:对于准备学习CC编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始! 编程学习书籍分享: 编程学习视频分享: 整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程) 欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦! 对于CC感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些CC的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!