c语言实现最简单的导航图
西安邮电的一个非常简单的导航图,使用dev即可运行
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define M 5000 //假设两顶点之间没有路径,用5000来表示
typedef struct vexsinfo //存放顶点信息的结构体
{
int park; //访问的标志,park=0是未被访问过
int num; //景点的编号
char name[32]; //景点的名称
char introduction[256]; //景点的介绍
}vexsinfo;
typedef struct MGraph
{
int r; //记录最短路径访问过的景点数目
int minrude; //记录最短路径的长度
int min[50]; //记录最短路径经过的顶点信息
int a[50]; //记录路线的数组
vexsinfo vexs[50]; //存放顶点编号的数组,用vexsinfo结构体的变量vexsinfo定义,可以用
//该数组存放顶点信息
int arc[50][50]; //存放两点之间权值的邻接矩阵
int v,e; //定点数和边数
} MGraph;
MGraph* CreateGraph()
{
MGraph *G;
int i,j,k;
G=(MGraph*)malloc(sizeof(MGraph)); //初始化访问标志
for(i=0;i<10;i++){
G->vexs[i].park=0;
} //初始化顶点数目和路线数目
G->v=10;
G->e=13; //给景点数组编号
for(i=1;i<=G->v;i++)
G->vexs[i].num=i;
for(j=1;j<=10;j++)
for(k=1;k<=10;k++)
{
G->arc[j][k]=M;
} //初始化矩阵,赋予每条边权值
G->arc[1][2]=G->arc[2][1]=100;
G->arc[1][3]=G->arc[3][1]=500;
G->arc[1][10]=G->arc[10][1]=800;
G->arc[2][6]=G->arc[6][2]=700;
G->arc[4][3]=G->arc[3][4]=700;
G->arc[4][5]=G->arc[5][4]=100;
G->arc[10][4]=G->arc[4][10]=400;
G->arc[6][7]=G->arc[7][6]=500;
G->arc[7][8]=G->arc[8][7]=400;
G->arc[10][7]=G->arc[7][10]=300;
G->arc[8][4]=G->arc[4][8]=700;
G->arc[8][10]=G->arc[10][8]=600;
G->arc[6][10]=G->arc[10][6]=400;
G->arc[9][6]=G->arc[6][9]=700;
G->arc[9][7]=G->arc[7][9]=900; //初始化顶点信息
strcpy(G->vexs[1].name ,"校 门");
strcpy(G->vexs[2].name ,"邮政所");
strcpy(G->vexs[3].name ,"基础教学楼");
strcpy(G->vexs[4].name ,"操场");
strcpy(G->vexs[5].name ,"美食广场");
strcpy(G->vexs[6].name ,"大学生活动中心");
strcpy(G->vexs[7].name ,"体育馆");
strcpy(G->vexs[8].name ,"旭日苑");
strcpy(G->vexs[9].name ,"天桥");
strcpy(G->vexs[10].name ,"图书馆");
strcpy(G->vexs[1].introduction ,"西安邮电大学长安南校区正门");
strcpy(G->vexs[2].introduction ,"邮政快递所");
strcpy(G->vexs[3].introduction ,"基础教学楼a,b,课程学习的地方");
strcpy(G->vexs[4].introduction ,"篮球场,排球场,乒乓球场,跑道");
strcpy(G->vexs[5].introduction ,"西安邮电大学的餐厅");
strcpy(G->vexs[6].introduction ,"举办各式特色活动");
strcpy(G->vexs[7].introduction ,"篮球喜好者的狂热,会举办篮球比赛");
strcpy(G->vexs[8].introduction ,"皇家旭日大酒店");
strcpy(G->vexs[9].introduction ,"东区西区连接的桥梁");
strcpy(G->vexs[10].introduction ,"学校图书馆,藏书颇多,学习圣地");
return G;
}
//使用了邻接矩阵的思想,从邻接矩阵的第一行第一个点对后面点的不断递归查找,返回上一层时候对顶点信息初始化为递归前的状态
//直接选取暴力枚举的方法,把所有的路径都给枚举出来
void RudeGraph(MGraph *G,int b,int w,int k,int sum){
int p,j,n;
if(b==w) { //如果找到终点则进行输出,否则继续查找
for(p=0;p<k;p++){
printf("%d->",G->a[p]);
}
printf("%d ",G->a[k]);
printf("路线总长:%dm\n",sum);
return ;
}
else{
for(j=1;j<=10;j++){
if(G->arc[b][j]<5000&&G->vexs[j].park==0){
k++;
G->a[k]=j;
sum+=G->arc[b][j];
G->vexs[j].park=1;
RudeGraph(G,j,w,k,sum); //通过递归对所有路径进行深度搜索
k--; //递归返回这一层后对顶点信息进行重新初始化
G->vexs[j].park=0;
sum-=G->arc[b][j];
}
}
}
return ;
}
int main(void)
{
int c,i,p,k;
MGraph *T;
T=CreateGraph();
while(1){
printf("**********************************\n");
printf("欢迎来到西安邮电大学景点信息服务系统\n");
printf("1.景点信息查询\n");
printf("2.路线查询服务\n");
printf("3.退出\n");
printf("**********************************\n");
printf("请选择你要查询的功能:\n");
scanf("%d",&c);
if(c==1){
printf("**********************************\n");
printf("西安邮电大学共有如下十处景点:\n");
for(i=1;i<=10;i++){
printf("%d.",T->vexs[i].num);
printf("%s: ",T->vexs[i].name);
printf("%s\n",T->vexs[i].introduction);
}
}
else if(c==2){
printf("**********************************\n");
printf("请输入当前景点编号和你想要去的景点编号:\n");
printf("(注:景点编号可在功能1内查询)\n");
int b,w; //初始化访问标志
for(i=0;i<10;i++){
T->vexs[i].park=0;
}
scanf("%d %d",&b,&w);
while(b<1||b>10||w<1||w>10){
printf("输入错误,请重新输入:\n");
scanf("%d %d",&b,&w);
}
if(b==w){
printf("您已经在此景点,请重新输入:\n");
scanf("%d %d",&b,&w);
}
else{
T->a[0]=b;
T->vexs[b].park=1;
printf("从景点%d到景点%d共有如下路径:\n",b,w);
RudeGraph(T,b,w,0,0);
printf("%d ",T->min[T->r]);
printf("路线总长:%dm\n",T->minrude);
T->minrude=100; //重新初始化最短路径长度
}
}
else if(c==3) break;
else printf("输入错误,请重新输入:\n");
}
return 0;
}