数据结构--校园导游----郁闷--大牛看看啊

阮文明 发布于 2012/12/16 15:04
阅读 275
收藏 3

输入5本来是可以调用void floyd(mgraph *g),可是我输入5怎么就终止程序了啊,bug,,第五个功能出问题了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100
#define infinity 8888888//表示无穷大
typedef struct 
{
 int adj;//表示路径长度
}arc,adj[max][max];
typedef struct 
{
 char name[20];//景点的名称
 int num;//顶点的编号
 char introd[100];//景点的介绍
}point;
typedef struct 
{
 
 point v[max];
 adj a;
 int numv;
 int numarc;
}mgraph;
mgraph mm;
mgraph init();//ok
void map();//ok
void shortestpath(mgraph *g);//ok
void floyd(mgraph *g);
void introduction();//ok
void allintroduction();//ok
int main()
{
 int data;
 mm=init();
 system("mode con: cols=500 lines=500&color de");
 printf("\t\t\t\t\t***********************************************************************************\n");
 printf("\t\t\t\t\t*                                                                                 *\n");
 printf("\t\t\t\t\t*                                                                                 *\n");
 printf("\t\t\t\t\t*                          欢迎使用湖南工业大学校园导游系统                       *\n");
 printf("\t\t\t\t\t*                                                                                 *\n");
 printf("\t\t\t\t\t*                                                                                 *\n");
 printf("\t\t\t\t\t***********************************************************************************\n");
 printf("\n\n");
// map();
 while (1)
 {
  printf("\t\t\t\t\t\t\t\t\t1:浏览湖工大全景\n");//ok
  printf("\t\t\t\t\t\t\t\t\t2:查看单个景点信息\n");//ok
  printf("\t\t\t\t\t\t\t\t\t3:查看所有景点信息\n");//ok
  printf("\t\t\t\t\t\t\t\t\t4:查看所有的游览路线\n");//ok
        printf("\t\t\t\t\t\t\t\t\t5:选择出发地和目的地\n");
  printf("\t\t\t\t\t\t\t\t\t6:退出校园导游系统\n");//ok
  printf("\t\t\t\t\t\t请输入(1-5之间的数字)");
  scanf("%d",&data);
  switch(data)
  {
  case 1:
   system("cls");
   map();
   break;
  case 2:
   system("cls");
   introduction();
   break;
  case 3:
   system("cls");
   allintroduction();
   break;
  case 4:
   system("cls");
   shortestpath(&mm);
    floyd(&mm);
   break;
  case 5:
   system("cls");
            floyd(&mm);
   break;
  case 6:
   exit(0);
  }

 }
 system("pause");
 return 0;
}
mgraph init()
{
 int i,j;
 mgraph m;
 m.numv=22;
 m.numarc=28;
 for (i=1;i<=m.numv;i++)
 {
  m.v[i].num=i;//对编号初始化
 }
    strcpy(m.v[1].name,"学校正门");
 strcpy(m.v[1].introd,"湖南工业大学大气的校门");
 strcpy(m.v[2].name,"科技楼");
 strcpy(m.v[2].introd,"许多部门办公的地方");
 strcpy(m.v[3].name,"篮球场");
 strcpy(m.v[3].introd,"工大的篮球场,有时候很多活动都在这开展");
 strcpy(m.v[4].name,"侧门2");
 strcpy(m.v[4].introd,"从这出校门可以直接坐到公交车");
 strcpy(m.v[5].name,"同心湖");
 strcpy(m.v[5].introd,"晚上貌似有很多情侣在这");
 strcpy(m.v[6].name,"第二食堂");
 strcpy(m.v[6].introd,"学生食堂之一");
 strcpy(m.v[7].name,"第三组团");
 strcpy(m.v[7].introd,"学生公寓之一");
 strcpy(m.v[8].name,"新塘派出所");
 strcpy(m.v[8].introd,"有事可以来这找派出所的叔叔哦");
 strcpy(m.v[9].name,"公共楼");
 strcpy(m.v[9].introd,"学生上课的主要地点");
 strcpy(m.v[10].name,"计通楼");
 strcpy(m.v[10].introd,"机房所在的地方");
 strcpy(m.v[11].name,"包设楼");
 strcpy(m.v[11].introd,"王牌专业的教学楼");
 strcpy(m.v[12].name,"包印楼");
 strcpy(m.v[12].introd,"包印专业的学生上课地方");
 strcpy(m.v[13].name,"综合楼");
 strcpy(m.v[13].introd,"可以在这借到书哦,物理实验也在这里做");
 strcpy(m.v[14].name,"土木楼");
 strcpy(m.v[14].introd,"土木学院的教学楼");
 strcpy(m.v[15].name,"第二组团/侧门1");
 strcpy(m.v[15].introd,"学生公寓之一");
 strcpy(m.v[16].name,"第五食堂");
 strcpy(m.v[16].introd,"学生食堂之一");
 strcpy(m.v[17].name,"体育场");
 strcpy(m.v[17].introd,"可以在这进行体育锻炼");
 strcpy(m.v[18].name,"理学院");
 strcpy(m.v[18].introd,"理学院的办公楼");
 strcpy(m.v[19].name,"消防食堂");
 strcpy(m.v[19].introd,"学生也可以在这吃饭,菜不错哦");
 strcpy(m.v[20].name,"图书馆");
 strcpy(m.v[20].introd,"建设中,暂时未开放");
 strcpy(m.v[21].name,"第一组团/临时食堂");
 strcpy(m.v[21].introd,"学生公寓之一,旁边有超市和食堂");
 strcpy(m.v[22].name,"湘妃阁");
 strcpy(m.v[22].introd,"30-35栋的学生可以来这里吃饭哦");
    for (i=1;i<=m.numv;i++)
        for (j=1;j<=m.numv;j++)
       m.a[i][j].adj=infinity;//没路的景点之间路径长度设置为无穷大
 m.a[1][2].adj=50;
 m.a[1][10].adj=100;
 m.a[1][15].adj=400;
 m.a[2][12].adj=100;
 m.a[2][4].adj=200;
 m.a[3][4].adj=100;
 m.a[3][5].adj=300;
 m.a[5][6].adj=30;
 m.a[6][9].adj=600;
 m.a[8][21].adj=50;
 m.a[8][22].adj=50;
 m.a[9][20].adj=100;
 m.a[9][19].adj=50;
 m.a[9][13].adj=50;
 m.a[9][18].adj=100;
 m.a[10][14].adj=50;
 m.a[10][15].adj=350;
 m.a[11][12].adj=50;
 m.a[11][13].adj=50;
 m.a[13][19].adj=100;
 m.a[14][16].adj=200;
 m.a[14][18].adj=100;
 m.a[15][16].adj=100;
 m.a[16][17].adj=100;
 m.a[18][22].adj=500;
 m.a[20][21].adj=200;
 m.a[21][22].adj=100;
 m.a[6][7].adj=100;
 for (i=1;i<=m.numv;i++)
  for(j=i;j<=m.numv;j++)
   m.a[j][i].adj=m.a[i][j].adj;
  return m;
}
void map()
{
 printf("\t\t\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
 printf("\t\t\t\t\t┃                                      ┏━━━━━┓                            ┃\n");
 printf("\t\t\t\t\t┃                                      ┃新塘派出所┃                            ┃\n");
 printf("\t\t\t\t\t┃               ┏━━━┓             ┗━━━━━┛                            ┃\n");
 printf("\t\t\t\t\t┃                 湘妃阁   22╳━━━━━━╳⑧━━━━                          ┃\n");
 printf("\t\t\t\t\t┃               ┗━━━┛   ┃             ┏━━━┓┃  ┏━━━━┓           ┃\n");
    printf("\t\t\t\t\t┃                            ┃              第一组团 ╳21┃临时食堂┃     ┏━┓┃\n");
 printf("\t\t\t\t\t┃                            ┃             ┗━━━┛┃  ┗━━━━┛     ┃第┃┃\n");
 printf("\t\t\t\t\t┃                            ┃                       ┃    ┏━┓         ┃三┃┃\n");
 printf("\t\t\t\t\t┃                            ┃                       ┃    ┃消┃     ⑦╳┃组┃┃\n");
 printf("\t\t\t\t\t┃                            ┃          ┏━━━┓   ┃    ┃防┃       ┃┃团┃┃\n");
 printf("\t\t\t\t\t┃                            ┃          ┃图书馆┃ 20╳    ┃食┃       ┃┗━┛┃\n");
 printf("\t\t\t\t\t┃              ┃     ┗━━━┛  ┃   ┃堂┃    ┃   ┃\n");
 printf("\t\t\t\t\t┃              ┃             ┃  ┗━┛    ┃   ┃\n");
 printf("\t\t\t\t\t┃              ┃                      ┃     ╳19      ┃    ┃\n");
 printf("\t\t\t\t\t┃                   ┃                      ┃     ┃        ┃┏━┓┃\n");
 printf("\t\t\t\t\t┃                 ┏━━┓   ┃                    ┃    ┃       ┃┃第┃┃\n");
 printf("\t\t\t\t\t┃              理学院 18╳━━━━━━━━━━━━━╳⑨━━━━━⑥╳┃二┃┃\n");
    printf("\t\t\t\t\t┃    ┏━━━┓   ┗━━┛                         ┏━━━━━┓┃      ┃┃食┃┃\n");
 printf("\t\t\t\t\t┃    ┃体育场┃              ┃                    ┃公 共  楼 ┃┃      ┃┃堂┃┃\n");
 printf("\t\t\t\t\t┃    ┗━━━┛              ┃                    ┗━━━━━┛┃      ┃┗━┛┃\n");
 printf("\t\t\t\t\t┃      17╳                  ┃                          ┏━━┓┃      ┃      ┃\n");
 printf("\t\t\t\t\t┃        ┃                  ┃                           综合楼 ╳13    ┃      ┃\n");
 printf("\t\t\t\t\t┃        ┃                  ┃                          ┗━━┛┃      ┃┏━┓┃\n");
 printf("\t\t\t\t\t┃  ┏━┓┃          ┏━┓  ┃                                  ┃      ┃┃同┃┃\n");
 printf("\t\t\t\t\t┃  ┃第┃┃          ┃土┃14╳      ┏━━┓                    ┃    ⑤╳┃心┃┃\n");
 printf("\t\t\t\t\t┃  ┃五┃╳16━━━━┫木┣━┫       无名湖             ┏━━┓┃      ┃┃湖┃┃\n");
 printf("\t\t\t\t\t┃  ┃食┃┃          ┃楼┃  ┃      ┗━━┛             包设楼 ╳11    ┃┗━┛┃\n");
 printf("\t\t\t\t\t┃  ┃堂┃┃          ┗━┛  ┃                          ┗━━┛┃      ┃      ┃\n");
 printf("\t\t\t\t\t┃  ┗━┛┃                  ┃                          ┏━━┓┃      ┃      ┃\n");
 printf("\t\t\t\t\t┃        ┃                  ┃                           包印楼 ╳12    ┃      ┃\n");
 printf("\t\t\t\t\t┃        ┃                  ┃                          ┗━━┛┃      ┃      ┃\n");
 printf("\t\t\t\t\t┣━━━━┫           ┏━┓ ┃                                  ┃      ┃┏━┓┃\n");
 printf("\t\t\t\t\t┃第二组团┃           ┃计┃ ┃                         ┏━━┓ ┃      ┃┃篮┃┃\n");
 printf("\t\t\t\t\t┣━━━━┫           ┃通┃ ╳10                        科技楼  ┃    ③╳┃球┃┃\n");
 printf("\t\t\t\t\t┃        ┃           ┃楼┃ ┃                         ┗━━┛ ┃      ┃┃场┃┃\n");
 printf("\t\t\t\t\t┃      15╳           ┗━┛ ┃      ┏━━━━━┓        ②    ┃      ┃┗━┛┃\n");
    printf("\t\t\t\t\t┃    ┏━━━┓━━━━━━━┗━━━┫ 学校正门 ┣━━━━╳━━━━━━┻╳④  ┃\n");
 printf("\t\t\t\t\t┃    ┃侧门 1┃                      ┗━━━━━┛                      ┏━━━┫\n");
 printf("\t\t\t\t\t┃    ┗━━━┛                            ①                            ┃侧 门2┃\n");
 printf("\t\t\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━┛\n");
    printf("\n");
}
void introduction()
{
 int num;
 printf("请输入景点的编号(1-22):");
 scanf("%d",&num);
 if(num<1||num>22)
 {
  printf("输入不对,请重新输入:");
     scanf("%d",&num);
 }
 printf("景点编号:%d\t景点名称:%s\t景点介绍:%s\n",mm.v[num].num,mm.v[num].name,mm.v[num].introd);

}
void allintroduction()
{
 int i;
 for(i=1;i<=mm.numv;i++)
  printf("景点编号:%d\t景点名称:%s\t景点介绍:%s\n",mm.v[i].num,mm.v[i].name,mm.v[i].introd);
}
void shortestpath(mgraph *g)
{
 int i,v,w,min,j,k=0,startnum,final[max],D[max],P[max][max];
 printf("请输入一个起始景点的编号:");
 scanf("%d",&startnum);
 if (startnum<0||startnum>22)
 {
  printf("输入的景点编号不对,请重新输入:");
  scanf("%d",&startnum);
 }
    for(v=1;v<=g->numv;v++)
 {
  final[v]=0;
  D[v]=g->a[startnum][v].adj;
  for(w=1;w<=g->numv;w++)
   P[v][w]=0;
  if (D[v]<infinity)
  {
   P[v][v]=1;
   P[v][startnum]=1;
  }
 }
  D[startnum]=0;
  final[startnum]=1;
  for(i=2;i<=g->numv;i++)
  {
   min=infinity;
   for(w=1;w<=g->numv;w++)
    if (!final[w]&&D[w]<min)
    {
     min=D[w];
                    v=w;
    }
    final[v]=1;
   for (w=1;w<=g->numv;w++)
   {
    if (!final[w]&&min+g->a[v][w].adj<D[w])
    {
     D[w]=min+g->a[v][w].adj;
     for(j=1;j<=g->numv;j++)
      P[w][j]=P[v][j];
     P[w][w]=1;
    }
   }
  }
  for (v=1;v<=g->numv;v++)
  {
   if(v!=startnum)
    printf("%s",g->v[startnum].name);
            for (w=1;w<=g->numv;w++)
            {
    if(w!=startnum&&P[v][w])
     printf("-->%s",g->v[w].name);
    k++;
   }
   if(v!=startnum&&k>g->numv-1)
    printf("\t\t路径长度:%d米\n",D[v]);
  }
}
void floyd(mgraph *g)
{
 int v,u,i,w,k,j,tag=1;
 int P[max][max][max],D[max][max];
 for(v=1;v<=g->numv;v++)
  for (w=1;w<=g->numv;w++)
  {
   D[v][w]=g->a[v][w].adj;
   for(u=1;u<=g->numv;u++)
    P[v][w][u]=0;
   if (D[v][w]<infinity)
   {
    P[v][w][v]=1;
    P[v][w][w]=1;
   }
  }
  for(u=1;u<=g->numv;u++)
   for(v=1;v<=g->numv;v++)
    for (w=1;w<=g->numv;w++)
    {
     if (D[v][u]+D[u][w]<D[v][w])
     {
      D[v][w]=D[v][u]+D[u][w];
      for(i=1;i<=g->numv;i++)
       P[v][w][i]=P[v][u][i]||P[u][w][i];
     }
    }
    while (tag)
    { printf("请输入出发点和目的地景点的编号:");
    scanf("%d %d",&k,&j);
    if (k<1||k>g->numv||j<1||j>g->numv)
    {
     printf("输入的编号不对,请重新输入:");
     scanf("%d %d",&k,&j);
    }
    if(k>=1&&k<=g->numv&&j>=1&&j<=g->numv)
     tag=0;
    }
         
    printf("%s",g->v[k].name);
    for(u=1;u<=g->numv;u++)
     if(P[k][j][u]&&k!=u&&j!=u)
     printf("%s",g->v[u].name);
     printf("%s",g->v[j].name);
     printf("\t\t总路径长度:%d米\n",D[k][j]);
}

加载中
0
Ryan-瑞恩
Ryan-瑞恩
佩服你画的学校地图……
阮文明
阮文明
搞好了 是那个三维数组开大了
Ryan-瑞恩
Ryan-瑞恩
@阮文明 @阮文明 我这里没有环境,有环境的话给你调试哈
阮文明
阮文明
晕 郁闷
0
小黑223
小黑223
佩服佩服
阮文明
阮文明
yun
0
1
18777179409
哇,你好棒呀!你好,我可以加你吗?我在做一个课程设计,跟这个差不多,我有一些疑惑
返回顶部
顶部