校园导游查询程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define MAX_VERTEX_NUM 11
#define INFINITY 1000
typedef int Status;
typedef char* VertexName;
typedef char* VertexInfo;
typedef struct ArcCell{
int distance;
}ArcCell,AdjMatrix;
typedef struct {
int num; //景点代号
VertexName Vertex; //景点名称
VertexInfo info; //景点介绍
}VertexType; //0位不存顶点
typedef struct{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph; //无向图
//------------后台构造可供查询的景点一览表------------
Status CreateMG(MGraph &G)
{
int i,j;
G.vexnum=10;G.arcnum=13;
G.vexs[1].num=1;G.vexs[1].Vertex="鲁迅纪念馆";G.vexs[1].info="在这里,你可以感受到伟人鲁迅的独特魅力!";
G.vexs[2].num=2;G.vexs[2].Vertex="芙蓉湖";G.vexs[2].info="漫步湖畔,感受诗意的生活!";
G.vexs[3].num=3;G.vexs[3].Vertex="上弦场";G.vexs[3].info="厦大运动场之一,因呈上弦月形状而得名";
G.vexs[4].num=4;G.vexs[4].Vertex="情人谷";G.vexs[4].info="又名思源谷,位于厦大水库旁,风景优美";
G.vexs[5].num=5;G.vexs[5].Vertex="建南大礼堂";G.vexs[5].info="厦大标志性建筑之一";
G.vexs[6].num=6;G.vexs[6].Vertex="芙蓉餐厅";G.vexs[6].info="三楼芙蓉小吃城可以让您饱餐一顿";
G.vexs[7].num=7;G.vexs[7].Vertex="人类历史博物馆";G.vexs[7].info="人类历史古物的展览馆";
G.vexs[8].num=8;G.vexs[8].Vertex="芙蓉隧道";G.vexs[8].info="冬暖夏凉,两侧的涂鸦新颖有趣,颇具趣味";
G.vexs[9].num=9;G.vexs[9].Vertex="图书馆";G.vexs[9].info="厦大图书馆总部,学生自习的好去处";
G.vexs[10].num=10;G.vexs[10].Vertex="高尔夫球场";G.vexs[10].info="高处的美景,青青草地";
for(i=1;i<11;i++)
for(j=1;j<11;j++)
G.arcs[i][j].distance=0; //赋初值
G.arcs[1][2].distance=3;G.arcs[1][3].distance=2;G.arcs[1][7].distance=7;G.arcs[1][9].distance=5;
G.arcs[2][9].distance=5;G.arcs[3][7].distance=5;G.arcs[3][5].distance=1;G.arcs[2][4].distance=3;
G.arcs[5][6].distance=6;G.arcs[4][6].distance=10;G.arcs[4][10].distance=2;G.arcs[6][7].distance=4;
G.arcs[6][8].distance=2;
for(i=1;i<11;i++)
for(j=1;j<11;j++)
if(G.arcs[i][j].distance==0)
if(G.arcs[j][i].distance!=0) G.arcs[i][j].distance=G.arcs[j][i].distance;
else G.arcs[i][j].distance=INFINITY;
return OK;
}//CreateMG
void Search_Vertex(MGraph G)//景点查询系统
{
int i;
char* s;
s=(char*)malloc(10*sizeof(char));
printf("\n请在这些景点中选择您想了解的景点:(输入00结束) ");
scanf("%s",s);
while(strcmp(s,"00"))
{
for(i=1;i<11;i+
+)
if(!(strcmp(G.vexs[i].Vertex,s)))
{
printf("\n景点名称 %s 的代号为 %d ,\n关于它的介绍: %s \n",s,G.vexs[i].num,G.vexs[i].info);
break;
}
if(i==11)
printf("\n查无此景点,请检查您的输入!\n");
printf("\n请再次在这些景点中选择您想了解的景点:(输入00结束) ");
scanf("%s",s);
}
}
void ShortestPath(MGraph G)
{
int i,j,min;
int p[11][11];
int D[11],final[11];
int v0,v,w0,w;
int xstart=0,xarrive=0;
char* start;
char* arrive;
arrive=(char*)malloc(10*sizeof(char));
start=(char*)malloc(10*sizeof(char));
printf("\n请输入起点:(输入00结束) ");
scanf("%s",start);
printf("\n请输入终点:(输入00结束) ");
scanf("%s",arrive);
while(strcmp(start,"00"))
{
for(i=1;i<11;i++)
{
if(!strcmp(G.vexs[i].Vertex,start)) {v0=G.vexs[i].num;xstart++;}
if(!strcmp(G.vexs[i].Vertex,arrive)) {w0=G.vexs[i].num;xarrive++;}
if(xstart==1&&xarrive==1) break;
}
if(xstart!=1||xarrive!=1) {printf("您输入的起点或终点有误,请重新输入!\n");continue;}
else {xstart=0;xarrive=0;}
for(v=1;v<=G.vexnum;++v)
{
final[v]=FALSE;
D[v]=G.arcs[v0][v].distance;
for(w=1;w<=G.vexnum;++w) p[v][w]=FALSE;//设空路径
if(D[v]
D[v0]=0;final[v0]=TRUE;//初始化,v0顶点属于S集
//开始主循环,每次求的v0到某个v顶点的最短路径,并加v到S集
for(i=1;i
min=INFINITY;
for(w=1;w<=G.vexnum;++w)
if(!final[w])
if(D[w]
for(w=1;w<=G.vexnum;++w)
if((!final[w])&&(min+G.arcs[v][w].distance
D[w]=min+G.arcs[v][w].distance;
for(j=1;j<=G.vexnum;++j)
p[w][j]=p[v][j];
p[w][w]=TRUE;
}//if
}//for
printf("\n从%s到%s的最短路径为: %s",start,arrive,start);
for(i=1;i<=G.vexnum;i++)
{
if(p[w0][i]==TRUE&&strcmp(G.vexs[i].Vertex,arrive))
printf("->%s",G.vexs[i].Vertex);
}
printf("->%s",arrive);
printf("\n\n请再次输入起点:(输入00结束) ");
scanf("%s",start);
printf("\n请再次输入终点:(输入00结束) ");
scanf("%s",arrive);
}//while
}//ShortestPath
//------------主函数------------
void main()
{
MGraph G;
int i;
CreateMG(G);
printf("您好!现在在可供查询的景点共10处,分别为:\n\n");
for(i=1;i<11;i++)
{
printf("%s\t",G.vexs[i].Vertex);
if(i%2==0)
printf("\n");
}
printf("\n");
printf("\n可进行的操作有:1、查询景点信息;2、查询最短路径。\n");
printf("\n首先选择您的操作:(输入对应序号即可,若输入0可退出系统) ");
scanf("%d",&i);
while(i)
{
switch(i)
{
case 1:Search_Vertex(G);break;
case 2:ShortestPath(G);break;
default:printf("输入错误,请重新输入!");
}
printf("\n再次选择您的操作:(输入对应序号即可,若输入0可退出系统) ");
scanf("%d",&i);
}
printf("谢谢使用,祝您生活愉快!\n");
}