资源描述
洛阳理工学院
课程设计说明书
课程名称数据结构课程设计
设计课题校园导游程序
专 业计算机科学与技术
班级
学号
姓名
完成日期
查询景点信息函数功能:在main主函数中调用search,打开存储了信息的文件,在显示界面显示已 有的景点名称和序号,游客按需求进行序号查询或者名称查询,输入需要查询的 序号或者名称后会显示该景点的名称及简介,而后按任意键返同上级菜单选择继 续查询或者返回主界面,在查询景点信息函数中实现。
1. 流程图:
开始12
查询两景点之间最短路径函数
1. 功能:在main函数中调用narrate函数,打开存储了信息的文件,游客输 入起点编号或者终点编号,利用迪杰斯特拉算法由ShortestPath最短路径函数 选择一条两点之间的最短路径展示给游客,关闭文件。
查询两景点之间所有路径函数
1.功能:当游客输入完毕后,根据之前构建的无向图,执行过程为进层和退层两个阶段。首先开始递归进层,考虑使用基于深度优先思想,在搜素过程中, 按照景点编号大小依次访问每一个节点,若访问到一个未被访问且有路径相通的 点则将其加入数组P,直到找到目的地,输出第一条路径,然后开始递归退层, 按照之前的方式递归访问它的所有未被访问的相邻节点。并通过相应的设置标志 visitcdf]的方式使最终能不重复地走遍所有的简单路径。最后输出这些路径即可。
添加新的顶点和路径
1. 功能:在Addncwsight添加新的景点和路径函数中实现,打开存储了信息 的文件,输入需要新添加的景点名称,基本信息介绍并依次输入它到原有各景点 的距离,将新信息存储到文件中并保存。
526删除已有的顶点和路径1.功能:删除不需要的景点信息,并保存删除后的文件,方便下一次浏览。
2.流程图:
史 按景点名称r按景点编号
527修改已有的顶点和路径功能:修改有误的景点信息,并保存修改后的文件,方便下一次浏览。
1. 流程图:
修改景点描述
修改景点名称
六、数据结构
MGraph定义图的类型,其中包含景点,景点之间的距离,景点数和边数。
VertexType是景点的结构体,里面包含了景点编号,景点名称,景点描述。ArcCell 是边的结构体,其中包含了边的长度即景点之间的距离。
typcdcf struct ArcCcll{
int adj;} ArcCcll;typcdcf struct VertexType{
int number;
char sight[ 100];
char description [1000];} VertexType;typedef struct{
VertexType vex [20];
ArcCell arcs[20][20];
int vexnum,arcnum;/*相邻接的景点之间的路程*//*定义边的类型*//*景点编号*/
/*景点名称*//*景点描述*//*定义顶点的类型*//*图中的顶点,即为景点*/
/*图中的边,即为景点间的距离*//*顶点数,边数*/
}MGraph;
/*定义图的类型*/七、测试
7.1.测试数据
输入:根据游客需求选择景点信息查询、景点之间最短路径查询、景点之间 所有路径查询、添加景点信息、删除景点信息或者修改信息。如果是景点信息查 询,再选择是按照景点编号或者景点名称查询,游客输入相应内容;如果是景点 之间最短路径查询或是景点之间所有路径查询则游客输入起始景点和结束景点; 如果是添加景点信息则按照提示依次输入信息内容;如果是删除景点信息,选择 按照名称删除或是按照序号删除,再输入相应内容进行删除;如果是修改信息, 按提示选择修改景点信息或者道路信息,再按提示输入修改后得内容
预期的输出结果:运行程序直接出现各景点及其编号,同时出现操作菜单, 其他结果依使用者需求而定,请参见程序后的运行结果。
1.菜单函数*************欢 迎使用洛阳理工学 院开兀校区校园导游程序**************
景点名称星于京验验院院
大图教主实实覆
012345678
星于京验验院院
大图教主实实覆
012345678
请输入您要查找的景点编号:1您要查找景点信息如下:
图书馆:环境优雅,充满书香气息,呈环形按任意键返回...■□□□□□□□□□
□□□□□□□□□
!主实
-1 “ J1. J \ 、——/、 /、 / \ilrz、 / 012345678
□□□□□□□□□
S itg 息点戚点 占w>常 占蔓Or的有有 景两两新已已 电询询^^ 有杳查退
12 3 4 5 6 0
请输入您的选择:
2.查询景点信息(按编号)查询景点信息(按名称)查询两景点之间的最短路径
*************欢迎使用洛阳理工学院开元校区校园导游程序**************□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
sw京验验居
大图教主实实蕾
012345679
请输入您要查找的景点名称:大明桥您要查找景点信息如下:
大明桥:落于小河上,风景优美课程设计任务书设计题目:校园导游程序设计内容与要求:
[问题描述]
用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景 点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路, 存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问题。 [基本要求]
(1) 查询各景点的相关信息;
(2) 查询图中任意两个景点间的最短路径。
(3) 查询图中任意两个景点间的所有路径。
(4) 增加、删除、更新有关景点和道路的信息。
指导教师:
2016年12月20日课程设计评语
成绩:
*************欢 迎使用洛阳理工学院开兀校区校园导潇程 序**************
C/
京
5^1子柬验验院院 大图教壬头实实寰 XJ/X]/\)/\J/\7 XI/\1/\»7 012345678
旅醒超虑虑(0〜8) : 1
请选岸终点熹点(0—8) : 7
从图书馆到璞院餐厅的最短路径是(最短距离为380m)图书馆一> 实验A棱一〉璞院餐厅请按任意键继续..・查询两点之间的所有路径
狄近1史用冶阳字阮汁兀我四我四导源程店***
□□□□□□□□
柬验着院 大图教主实实覆 012345678
□□□□□□□□
占g点 旦意 1 出目
K——441 先宠
t
t
1
> 一 > 一
S 厅->->->-> 磨大大图图
> > > > > _____ 亍 备厅厅蚯 美buFff剪
章子子子* > > > > > - ------r 迷
"验验验验完
实实实实实璞
Sil 123456 有其舄第第尊
添加新的景点及其路径添加过程
■ C:\Users\G Y X\Desktop快命名 1.exe*************欢迎使用洛阳理工学院开元校区校园导游程序**************蠢验验院院 大图教主实实董 X)/ XJZ \)z X)/ \1/\JZ 012345678
蠢验验院院 大图教主实实董 X)/ XJZ \)z X)/ \1/\JZ 012345678
请输入新景点的序号: 离输入新景点的名称: 或漪的露*************欢迎使用洛阳理工学院开元校区校园导游程序**************□□□□□□□□□
□□□□□□□□□
SW柬验验院院 大图教hH头实实鬟 \J/\)/\JZ KI/X)/\)/\JZ 012345678
□□□□□□□□□
隋输入此景点到第0个景点的距离(单位:m)(同一景点或不可到达用20000表示,极大值):
*************欢迎使用洛阳理工学院开元校区校园导游程序**************
景点名称
□□□□□□□□□□
厅厅
sw螯验验院 大图教玉头实实妻南 0123456789
□□□□□□□□□□
、曰或 自5可间占队占::占;:
l翼 占篁尊的有有 景两两新已已 询询询加 查查查添譬退
12 3 4 5 6 0
请输入您的选择:
添加后删除景点删除过程*************欢迎使用洛阳理工学院开元校区校园导游程序**************
景点名称
SW蕾验验院院 大图教玉头实实寨 \J/\J/XI/\1/\J/\1/\J/XI/\1/ 012345678
□□□□□□□□□
删除后
请输入您要删除景点的编号:8删除成功!按任意键返回...
*************欢迎使用洛阳理工学§兀开兀校区校园导潇程序**************蚤验验院件 大图教壬头实实荔南 \—/XJZ \1/\)z s)/SI/\1/K)/ 0123456789
蚤验验院件 大图教壬头实实荔南 \—/XJZ \1/\)z s)/SI/\1/K)/ 0123456789
蚤验验院件 大图教壬头实实荔南 \—/XJZ \1/\)z s)/SI/\1/K)/ 0123456789
请输入您的选择:
2. 修改景点信息
*************欢迎使用洛阳理工学院开元校区校园导游程序**************口口□□□□□□□
口口□□□□□□□
口口□□□□□□□
大图教玉头实实曹
\17 \)z \J-X17 \)/\)/\J/\JZ\JZ
012345679
□□□□□□□□□
或 11^0苫窒昼髯 占窒善的有有 景两两新已已 询询询加 查查查添
12 3 4 5 6 0
请输入您的选择:
修改后
*************欢迎使用洛阳理工学院开元校区校园导游程序**************景点名称
需翳后的景点名称:
□□□□□□□□
大图教玉头实实薯 \1/\J \J/\JZ \J \J/\1/\J XJ/ 012345679
□□□□□□□□
12 0
占g点
请输入您的选择:1
修改成功!
*************欢迎使用洛阳理工学院开元校区校园导游程序**************
景点名称
□□□□□□□□□
WSI
\—/ VI/ YJ- \JZ \J K)/ \7K1/\JZ 012345679
□□□□□□□□□
s
n^ 或
占食蓑的有有
t两两新已己
—1
12 3 4 5 6 0
3. 文件内容
文件(F)编辑(E)俺0(0)查看(V)蒂助(H)落于木孺①,风景优美京境4融隽满书香气息,
京境4融隽满书香气息,
呈环形
氟驾自习的地方,临近图书馆 巳餐养衿霰修过的餐厅,临近实验楼,是男女比例最适中的餐厅皿楼昂二避斑矗男生宿舍,食物种类比较多 旱三霸毛矗女生宿舍楼,比较便宜
f| count -记事本文件(F)编辑(E)格式(0)查看(V)耕助(H)9-
通过对这次对校园导游系统程序编写,我切实体会到了如何编写一个较大 的程序。这是我自己相对独立做的最大的一个程序,过程中遇到了各种各样的问 题。但同时巩固了课堂上所学的知识,也学到了很多新的东西,也收获了很多。
拿到题目,第一步就是构思,分析,创建。题目要求用无向网完成,所以 我考虑的是用邻接矩阵存储这个无向网,参考了书上的无向网的邻接矩阵存储程 序写了 CrcatUDNo
查询两个景点之间的最短路径刚开始我参考的是书上的迪杰斯特拉算法,后 来发现书上定义的顶点的结构体数组内容太简单,程序考虑的情况也很简单,无 法满足我题目的需求,于是我乂把辿杰斯特拉算法研读了一遍,自己做了改进。
查找所有路径的Searchpath 1函数刚开始一直没有写出来,我和同学先在纸 上画出顶点,参考深度优先遍历把整个路径走了一遍,但是编程没有什么思路, 上网查找了关于这个算法的资料,看到有人说可以考虑用递归实现,就试着用递 归实现,同时参照迪杰斯特拉算法用一个数组收集访问过的顶点,还设置了一个 标志量标记顶点是否被访问。
文件在上学期的课设中我写过,当时学习了一些关于文件的知识,所以运用 并没有遇到太多问题,利用文件保存数据,需要fopcn打开文件进行读写,还要 fclosc函数进行关闭操作,可能还会用到frcad读取文件。后来知道a+可以继续 录入,于是我通过加入一个a+形式的语句,实现了可不定时地增加景点数据的 功能
所有框架写查找、删除、修改和添加函数本身并不太难,写好以后用main 函数调用可以了。
写出框架后,刚开始运行也是没什么问题的,但是多做几步就遇到了问题。
在添加的日寸候,刚开始没有考虑序号,程序自动生成的序号和我想。要的并不是 一种,于是我在添加景点里面让游客自己输入序号。后来又发现删除没有考虑找 不到需要删除的目标的可能性,用一个判断符a来判断是否删除成功。接下来整 个运行都没有错但是如果删除两个景点就会出现问题了 ,试了很久发现是循环条 件有问题,虽然固定了景点编号number,但是循环的num和number不能对应, 于是去询问老师,老师说可以把整个邻接矩阵重新修改或者设置特殊符号控制输 出,我选择了相对简便的修改方法。
这个程序很长,编写花了很多时间,在程序编写过程中,我不断遇到困难, 调试时更是出现了很多问题,一个个的修改,有的花了很长的时间。但我的努力 和辛苦没有白费,在老师的指导,同学的帮助,和自己的努力下我终于完成了这 个程序。很感谢老师最后的点睛之笔,在我和同学冥思苦想很长时间都没有解决 方案的时候是老师帮助我们解决了问题。同时也反映出我思考问题的不全面和经 验的欠缺。
在程序编写和解决问题时,每一个细节都很重要,既要避免功能的重复也 要避免功能疏漏的地方。理论和实践相结合是学好数据结构的关键,这次的课设 既培养了我们的自学能力,也提高了我们的学习兴趣。
九、源程序
/*相邻接的景点之间的路程*/
/*定义边的类型*/
/*图中的顶点,即为景点*/
/*图中的边,即为景点间的距离*/
/*顶点数,边数*/
/*定义图的类型*/
/*变量类型声明,声明fp是FILE型指针,用
/*把图定义为全局变量*/
/*学校名称*/
/*用来存放图中的边*/
/*全局数组,用来存放路径上的各顶点*/
/*全局数组,用来记录各顶点被访问的情况*/
/*全局变鬲,用来记录每对顶点之间的所有路
/*辅助变量存储最短路径长度*/
^include <string.h>#include <stdio.h>#includc <malloc.h>
//include <stdlib.h> #define Max 20000 typcdcf struct ArcCcll {
int adj;{ArcCell;typcdef struct VertexType (int number; char sightfl00];
char description[1000]; {VertexType;typcdcf struct{
Vc rtcxTypc vex [20];ArcCell arcs[20]|20]; int vex num,arcnum;JMGraph;FILE *fp,*count; 于指向file类型*/ MGraph G;
char namcofschool[100]; intNUM=9;int P[20][20];int p[20];int visited[20];
int a=0; 径的条数*/ long int D[20|;void CreateUDN(int v,int a); void narrate。;void ShortcstPadi(int num);
/*景点编号*/
/*景点名称*//*景点描述*/
/*定义顶点的类型*//*造图函数*/
/*说明函数*//*最短路径函数*/
指导教师:
年 月 日
void output(int sight1,int sight2); int MenuQ;void search0;int ScarchMcnuO;void HaMiTonian(int);
void Searchpath 1 (MGraph g);void disppath(MGraph g,int i,int j); void path(MGraph g,int i,int j,int k); void NcxtValuc(int);void displayO;int Addncwsight(int n);
int DeletcsightO;void Changesight();int ChangemenuO;int SightmenuO;
/*输出函数*/
/*主菜单*/
/*查询景点信息*/
/*查询子菜单*/
/*图的遍历*/
/*查询两个景点间的所有路径*//*确定路径上第k+1个顶点的序号*/
/*显示遍历结果*//*添加新的景点和路径*//*删除景点和路径*/
/*修改景点和路径*/
/*修改路径或顶点的选择菜单*/
/*选择需该景点的菜单*/void main。
/*主函数*/
int vO,vl;int ck;CreateUDN(NUM,ll);do
ck=McnuQ; switch (ck)
case 1:
sc arch 0;
break;
case 2:
system f'cls");narrateQ;printf("\n\n\t\t\t 请选择起点景点(0〜%d) :”,NUM-1); scanf("%d",&vO);printf(H\t\t\t 请选择终点景点(0〜%d): ”,NUM-1); scanf(,,%d",&vl);
ShortestPath(vO);/*计算两个景点之间的最短路径*/output(vO,vl);/* 输出结果 */printfC\n\n\t\t\t\t 请按任意键继续getcharO;
gctcharQ;break;
case 3:
system("cls");narrateQ;Searchpath 1 (G);printf(H\n\n\t\t\t\t 请按任意键继续 getcharQ;
getcharO;break;case 4:
systcmCcls,narrate。;NUM二Addncwsight(NUM);systcm("cls'*);
narrate 0;break;case 5:
NUM二Dclctcsight。;break;case 6:
ChangesightQ; break;};
}
while(ck!=O);
}
int MenuQ/* 主菜单 */
{
int c;
int fla敏
do{
flag=1;
systcm("cls");
narrate。;
printt( \n\t\t\t |
「\n ),
printff'\t\t\t |
1 3);
printfC'\t\t\t |
1、
查询景点信息
1 \");
printf(H\t\t\t |
2、
查询两景点间最短路径
1 \仍;
printfC\t\t\t |
3、
查询两景点间所有路线
1 \n“);
printff'\t\t\t |
4、
添加新的景点和路径
1 \n”);
printff\t\t\t |
5、
删除已有景点和路径
1 \n”);
printf("\t\t\t |
6、
修改已有景点或路径
1 \n”);
printff*\t\t\t |
0、
退出
1 W);
printff'\t\t\t |
1 3);
printf("\t\t\t 1
—
」3);
printfC\t\t\t\t请输入您的选择:,
scanf("%d",&c);if(c==1 | |c==2| |c==3| |c==4| |c==5| |c==6| |c==0) flag=O;
Jwhile(flag);
return c;int ScarchMenuO
int ScarchMenuO
int ScarchMenuO
int c;
int flag;
do(
flag= 1;
system("cls");
narrate。;
printff\n\t\t\t r
printf("\t\t\t |
1 3);
printff'\t\t\t |
1、按照景点编号查询
1 \n”);
printf(”\t\t\t |
2、按照景点名称查询
1 \n”);
printff'\t\t\t |
0、返回
1 W);
printfC\t\t\t |
1 5”);
printf("\t\t\t 1
—
—1 \仍;
i E;
/*查询子菜单函数*/
printff\t\t\t\t请输入您的选择:’); scanf("%d",&c);if(c==l | |c==2| |c==0)
flag=O;} while (flag);return c;void search。
return c;void search。
void search。
/*查询景点信息函数*/int num;int i;int c;
/*读打开原文件book.txt*/ /*读写count文件*/
char name[20];fp二fbpen(”guide.txt”, ”r+, count=fopcn("count.txt","r+"); do system("clsH); c=SearchMcnu(); switch (c)
case 1:
systemC'cls,
narratcQ;
printf("\n\n\t\t请输入您要查找的景点编号:”); scanf("%cl",&num);
for(i 二 O;ivNUM;i++)
if(num==G.vcx[i].number)
{
printfC\n\n\t\t\t您要查找景点信息如下:,
printf("\n\n\t\t\t%s: %-25s\n\n",G.vex[i].sight,G.vex[i].description);
printfC\n\t\t\t 按任意键返回...”);
getcharO;
getcharO;
break;
}
}
if(i=NUM)
{
printf("\n\n\t\t\t 没有找到! **);
printfC\n\n\t\t\t 按任意键返回...”);
getcharQ;
getcharO;
}
break;
case 2:
systemf'els'*);
narrate。;
printf("\n\n\t\t请输入您要查找的景点名称:,
scan f("%sn,name);
for(i=0;i<NUM;i++)
{
if(!strcmp(namc,G .vex [i]. sight))
{
printf(H\n\n\t\t\t您要查找景点信息如下:,
printf("\n\n\t\t\t%s:%-25s\n\nn,G.vex[i].si^it,G.vex[i].description);
printfC\n\t\t\t 按任意键返回...”);
getcharO;
getcharO;
break;
}
}
if(i=NUM)
printf("\n\n\t\t\t 没有找到!");
printfC\n\n\t\t\t 按任意键返回
gctcharQ;
getcharQ;
}
break;
}}while(c!=O);f\vrite(&G,sizeof(MGraph),l,fp);/* 保存到文件中 */fclosc(fp);
fprintf(count,"%d”,NUM); fclosc(count);
}
void CrcatcUDN(int v,int a)
{
int i,j;
if((fjp=fopen(,'guide.txt";,a+"))==NULL) ticket文件保存记录的详细信息
{
printf(”文件未找到\n>;
}
if((count=fopcn("count.txt,,,,\v+ ”))二二NULL) {
fprintf(count,"0");
f\vrite(&G,sizeof(MGraph),l,fp);/* 保存到文件中 */fclosc(fp);
fprintf(count,"%d”,NUM); fclosc(count);
}
void CrcatcUDN(int v,int a)
{
int i,j;
if((fjp=fopen(,'guide.txt";,a+"))==NULL) ticket文件保存记录的详细信息
{
printf(”文件未找到\n>;
}
if((count=fopcn("count.txt,,,,\v+ ”))二二NULL) {
fprintf(count,"0");
fclosc(fp);
fprintf(count,"%d”,NUM); fclosc(count);
}
void CrcatcUDN(int v,int a)
{
int i,j;
if((fjp=fopen(,'guide.txt";,a+"))==NULL) ticket文件保存记录的详细信息
{
printf(”文件未找到\n>;
}
if((count=fopcn("count.txt,,,,\v+ ”))二二NULL) {
fprintf(count,"0");
fclosc(fp);
fprintf(count,"%d”,NUM); fclosc(count);
}
void CrcatcUDN(int v,int a)
{
int i,j;
if((fjp=fopen(,'guide.txt";,a+"))==NULL) ticket文件保存记录的详细信息
{
printf(”文件未找到\n>;
}
if((count=fopcn("count.txt,,,,\v+ ”))二二NULL) {
fprintf(count,"0");
/*创建初始图函数*/
//调用了 fopen,要用fclose关闭
//count文件保存记录的条数
elsefscan F(coun t,"%d ",&N U M);strcpy(namcofschool,”洛阳理工学院开元校区,/*初始化结构中的景点数和边
strcpy(namcofschool,”洛阳理工学院开元校区,/*初始化结构中的景点数和边
/*初始化结构中的景点数和边
/*初始化结构中的景点数和边
/*初始化每-•个景点的编号*/
G.vexnum=v;数*/G.arcnum=a;for(i=0;i<20;++i) G.vex[i].number=i;
/*初始化每一个景点名及其景点描述*/ strcpy(G.vcx[O],sight,"大明桥"); srrcpy(G.vex[0].description,"^于小河上,风景优美"); strcpy(G. vex [1 ] .sigh t,"图书馆"); strcpy(G.vex[1].description,"5^境优雅,充满书香气息,呈环形, strcpy(G. vex [2] .sigh t," 学楼");strcpy(G. vex [2].description,"±课和自习的地方,临近图书馆”);strcpy(G.vex[3].sight,"子衿餐厅,strcpy(G.vex[3].dcscription,”一餐厅,新装修过的餐厅,临近实验楼,是男女比例最适中的餐 厅,
strcpy(G.vex[4].sight,”实验 A 楼)strcpy(G. vex [4].description,"老师办公室”);strcpy(G.vex[5].sight,"实验 B 楼");strcpy(G .vex [5] .description,"计算机机房,
strcpy(G.vex [6].sight/ 实验 C 楼,strcpy(G. vex [6].description,H 电气实验楼”);strcpy(G.vex [7] .sigh t,"璞院餐厅");strcpy(G.vcx[7].dcscription,”第二餐厅,临近男生宿舍,食物种类比较多”);
strcpy(G.vex[8].sight,"£秀院餐厅”);strcpy(G.vex[8].description;^H餐厅,临近女生宿舍楼,比较便宜,/*这里把所有的边假定为20000,含义是这两个景点之间是不可到达,极大值*/for(i=0;i<20;++i)
for(j=0;j<20;++j)
G.arcs[i][j].adj=Max;
/*
下边是可直接到达的景点间的距离,由于两个景点间距离是互相的,
所以要对图中对称的边同时赋值。
*/
G.arcs[0][l].adj=G.arcs[l][0].adj=50;
G.arcs[l][3].adj=G.arcs[3][l].adj=70;
G.arcs[0][6].adj=G.arcs [6][0].adj=250;
G.arcsfl][4].adj=G.arcs[4][l].aclj=80;
G.arcs[2][4].adj=G.arcs[4][2].adj=100;
G.arcs[3][5].adj=G.arcs[5][3].adj=90;
G.arcs [5] [2]. adj=G.arcs[2][5].adj=100;
G.arcs[4][6].adj=G.arcs[6][4].adj=75;
G.arcs[4][7].adj=G.arcsP][4].adj=300;
G. arcs [2] [7]. adj=G. arcs [7] [2] .adj=400;
G.arcs[7][8|.adj二G.arcs[8][7].adj=40;
f\vrite(&G,sizeof(MGraph),1,fp);〃保存到文件中
fclosc(fp);〃关闭文件,但不是屏幕
fj)rintf(count,”%d”,NUM);
fclosc(count);void narrateO /* 说明函数 */int i;printf("\n\t*************欢迎使用%,校园导游程序**************\n",namcofschool);
printf("\t\n");printf(H\t\t\t\t景点名称\t\t\t\t\t\t\n");printf("\t\t\r\n");for(i=0;ivNUM;i++)
if(G.vex[i].numbcr!=-l){
printf("\t\t\t\t%c (%2d)%~10s%c\n",3,G.vcx[i].numbcr,G.vcx国.sight,3);/* 输出景点列表*/}printf("\t\t\r\仍;
void ShortcstPath(int num)/*迪杰斯特拉算法最短路径函数num为入口点的编号*/(int v,w,i,t;/* i、w和v为计数辅助变量*/
int final[20];/* 辅助数组 */int min;
fp=fopcnC'guidc.txt',,,'r4-u);〃读打开原文件 book.txt
count=fopcn(,'count.txt","r+H);//读写 count 文件for(v=0;v<NUM;v++){
finalM^O;/*假设从顶点num到顶点v没有最短路径*/
D[v]=G.arcs[num][v].adj;/*将与之相关的权值放入D中存放*/
for(w=0;w<NUM;w++) /* 设置为空路径 */
P[v][w]=0;
if(D[v]<20000) /* 存在路径 */
{
P[v][num] = l;/*存在标志置为1 */
P[v][v]=l;/*自身到自身*/D[num]=0;final[num] = l;/*初始化num顶点属于S集合*/
/*开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到S集合*/ for(i=0;ivNUM;++i) /* 其余 G.vcxnum-1 个顶点 */{
min=Max; /*当前所知离顶点num的最近距离*/
for (\v=0; w v N U M;++w)
if(!final[w]) /* w 顶点在 v-s 中 */
if(D[w]<min) /* w顶点离num顶点更近*/
{
v=w;
min=D[\v];
}
final[v]=1; /*离num顶点更近的v加入到s集合*/
for(w=0;wVNUM;++、v) /*更新当前最短路径极其距离*/ if(!final[w]&&((min+G.arcs[v][w].adj)<D[\v]))/*不在s集合,并且比以前所我到的路径都 短就更新当前路径*/
{
D[w] =min+G.arcs[v] [w].adj;
fbr(t=0;t<NUM;t++)
P[w][t]=P[v][t];
Plw][w]=l;
}
} fwrite(&G,sizeof(MGraph),l ,fp);〃保存到文件中
fclosc(fp);
fprintf(count,"%d”,NUM);
fclose(count);}void output(int sightl,int sight2) /* 输出函数 */(
inc a,b,c,d,q=0;
a=sight2; /*将景点二赋值给a */
if(a!=sight1) /*如果景点二不和景点一输入重合,则进行...*/
{
printf(H\n\t 从%$ 到%$ 的最短路径是”,G.vex[sight1].sight,G.vex[sight2].sight);/* 输出 提示信息*/
printft(最短距离为%dm.)\n\n\t",D[a]); /*输出sight!到sigh(2的最短路径长 度,存放在D[]数组中*/printf("\t%s',,G.vex[sightl].sight); /* 输出景点一的名称 */d=sight1;/*将景点一的编号赋值给d */fbr(c=0;cVNUM;++c)
{gate:; /*标号,可以作为got。语句跳转的位置*/P[a][sightl]=O;for(b=0;b<NUM;b++)
{if(G.arcs[d][b].adj<20000&&P[a][b]) /*如果景点一和它的一个临界点之间存在路径旦最短路径*/printf(,,~>%sM,G.vex[b].sight); /* 输出此节点的名称 */ q=q+1;/*计数变量加一,满8控制输出时的换行*/
Pla][b]=O;d=b;/*将b作为出发点进行下一次循环输出,如此反复*/if(q%8==0) printf(”\n”);goto gate;/*从当前位置出发*/
void Searchpathl(MGraph g)/*查询两个景点间的所有路径*/{
展开阅读全文