数据结构-校园导游咨询系统…

//本程序最好在VC++中运行,但这是C程序,在TC中,显示结果会出现乱码,TC不支持汉字
#include "string.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define Max 20000
#define NUM 9
typedef struct ArcCell
{
  int adj; 
}ArcCell;
typedef struct VertexType
{
  int number; 
  char *sight; 
  char *description;
}VertexType;   

typedef struct
{
  VertexType vex[NUM];
  ArcCell arcs[NUM][NUM];
  int vexnum,arcnum;
}MGraph;   

MGraph G;   
int P[NUM][NUM]; 
long int D[NUM]; 
int    x[9]={0};
void CreateUDN(int v,int a);
void narrate();   
void ShortestPath(int num);
void output(int sight1,int sight2);
char Menu();   
void search();   
char SearchMenu(); 
void    HaMiTonian(int);   
void    NextValue(int);   
void    display();
void main()
{
 
  int v0,v1;
  char ck;
  CreateUDN(NUM,11);
  do
 
  ck=Menu();
  switch(ck)
  {
  case '1':
    system("cls");
  // narrate();
    printf("nnttt请选择起点景点(0~8):");
    scanf("%d",&v0);
    printf("ttt请选择终点景点(0~8):");
    scanf("%d",&v1);
    ShortestPath(v0); 
    output(v0,v1);       
    printf("nntttt请按任意键继续...n");
    getchar();
    getchar();
    break;
  case '2':search();
    break;
  case '3':
    system("cls");
    //narrate();
    x[0]=1;   
    HaMiTonian(1);
    printf("nntttt请按任意键继续...n");
    getchar();
    getchar();
    break;
  };
  }while(ck!='e');
 
 
}
char Menu() 
{
  char c;
  int flag;
  do{
  flag=1;
  system("cls");
  narrate();
  printf("nttt┏━━━━━━━━━━━━━━━┑n");
  printf("ttt┃                                                          ┃n");
  printf("ttt┃          1、查询景点路径                ┃n");
  printf("ttt┃          2、查询景点信息                ┃n");
  printf("ttt┃          3、推荐参观路线                ┃n");
  printf("ttt┃          e、退出                                ┃n");
  printf("ttt┃                                                          ┃n");
  printf("ttt┗━━━━━━━━━━━━━━━┛n");
  printf("tttt请输入您的选择:");
  scanf("%c",&c);
  if(c=='1'||c=='2'||c=='3'||c=='e')
    flag=0;
  }while(flag);
  return c;
}

char SearchMenu() 
{
  char c;
  int flag;
  do{
  flag=1;
  system("cls");
  narrate();
  printf("nttt┏━━━━━━━━━━━━━━━┑n");
  printf("ttt┃                                                          ┃n");
  printf("ttt┃          1、按照景点编号查询        ┃n");
  printf("ttt┃          2、按照景点名称查询        ┃n");
  printf("ttt┃          e、返回                                ┃n");
  printf("ttt┃                                                          ┃n");
  printf("ttt┗━━━━━━━━━━━━━━━┛n");
  printf("tttt请输入您的选择:");
  scanf("%c",&c);
  if(c=='1'||c=='2'||c=='e')
    flag=0;
  }while(flag);
  return c;
}
void search() 
{
  int num;
  int i;
  char c;
  char name[20];
 
  do
  {
  system("cls");
  c=SearchMenu();
  switch (c)
  {
  case '1': 
    system("cls");
    narrate();
    printf("nntt请输入您要查找的景点编号:");
    scanf("%d",&num);
    for(i=0;i<NUM;i++)
    {
      if(num==G.vex[i].number)
      {
        printf("nnttt您要查找景点信息如下:");
        printf("nnttt%-25snn",G.vex[i].description);
        printf("nttt按任意键返回...");
        getchar();
        getchar();
        break;
      }
    }
    if(i==NUM)
    {
      printf("nnttt没有找到!");
      printf("nnttt按任意键返回...");
      getchar();
      getchar();
    }
   
    break;
  case '2':
    narrate();
    system("cls");
    printf("nntt请输入您要查找的景点名称:");
    scanf("%s",name);
    for(i=0;i<NUM;i++)
    {
      if(!strcmp(name,G.vex[i].sight))
      {
        printf("nnttt您要查找景点信息如下:");
        printf("nnttt%-25snn",G.vex[i].description);
        printf("nttt按任意键返回...");
        getchar();
        getchar();
        break;
      }
    }
    if(i==NUM)
    {
      printf("nnttt没有找到!");
      printf("nnttt按任意键返回...");
      getchar();
      getchar();
    }
    break;
  }
  }while(c!='e');
}
void CreateUDN(int v,int a)
{
  int i,j;
  G.vexnum=v; 
  G.arcnum=a;
  for(i=0;i<G.vexnum;++i) G.vex[i].number=i;
 
 
 
  G.vex[0].sight="行政楼";
  G.vex[0].description="学校领导,办公室之地。";
  G.vex[1].sight="大礼堂";
  G.vex[1].description="业余活动,举办各种晚会。";
  G.vex[2].sight="11教";
  G.vex[2].description="教室,自习室";
  G.vex[3].sight="10教";
  G.vex[3].description="教室,自习室";
  G.vex[4].sight="图书馆";
  G.vex[4].description="阅览,借阅图书";
  G.vex[5].sight="第八食堂";
  G.vex[5].description="餐饮休闲";
  G.vex[6].sight="小河";
  G.vex[6].description="休闲,放松心情";
  G.vex[7].sight="第九食堂";
  G.vex[7].description="餐饮休闲";
  G.vex[8].sight="学23";
  G.vex[8].description="休息";
 
 
  for(i=0;i<G.vexnum;++i)
  for(j=0;j<G.vexnum;++j)
  G.arcs[i][j].adj=Max;
  G.arcs[0][1].adj=G.arcs[1][0].adj=12;
  G.arcs[0][2].adj=G.arcs[2][0].adj=6;
  G.arcs[0][3].adj=G.arcs[3][0].adj=5;
  G.arcs[1][4].adj=G.arcs[4][1].adj=11;
  G.arcs[2][4].adj=G.arcs[4][2].adj=2;
  G.arcs[3][5].adj=G.arcs[5][3].adj=4;
  G.arcs[5][7].adj=G.arcs[7][5].adj=9;
  G.arcs[4][6].adj=G.arcs[6][4].adj=2;
  G.arcs[4][7].adj=G.arcs[7][4].adj=14;
  G.arcs[6][8].adj=G.arcs[8][6].adj=7;
  G.arcs[7][8].adj=G.arcs[8][7].adj=3;
}
void narrate()
{
  int i,k=0;
  printf("ntt*****************欢迎使用校园导游程序***************n");
  printf("ntt********************济南大学*******************n");
  printf("t__________________________________________________________________n");
  printf("tt景点名称tt|t景点描述n");
  printf("t________________________________|_________________________________n");
  for(i=0;i<NUM;i++)
  {
  printf("t (%2d)%-10sttt|t%-25sn",i,G.vex[i].sight,G.vex[i].description);
  k=k+1;
  }
  printf("t________________________________|_________________________________n");
}
void ShortestPath(int num)
{
  int v,w,i,t; 
  int final[NUM];
  int min;
  for(v=0;v<NUM;v++)
  {
  final[v]=0; 
  D[v]=G.arcs[num][v].adj;
  for(w=0;w<NUM;w++)
    P[v][w]=0;
  if(D[v]<20000) 
  {
    P[v][num]=1;
    P[v][v]=1;
  }
  }
 
  D[num]=0;
  final[num]=1;         
             
  for(i=0;i<NUM;++i)       
  {
  min=Max;       
  for(w=0;w<NUM;++w)
    if(!final[w])     
      if(D[w]<min)   
      {
        v=w;
        min=D[w];
      }
      final[v]=1;   
      for(w=0;w<NUM;++w) 
        if(!final[w]&&((min+G.arcs[v][w].adj)<D[w]))
        {
          D[w]=min+G.arcs[v][w].adj;
          for(t=0;t<NUM;t++)
            P[w][t]=P[v][t];
          P[w][w]=1;
        }
  }
}
void output(int sight1,int sight2)     
{
  int a,b,c,d,q=0;
  a=sight2;     
  if(a!=sight1)     
  {
  printf("nt从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);
  printf("t(最短距离为 %dm.)nnt",D[a]); 
  printf("t%s",G.vex[sight1].sight);   
  d=sight1;         
  for(c=0;c<NUM;++c)
  {
gate:;             
        P[a][sight1]=0;
        for(b=0;b<NUM;b++)
        {
          if(G.arcs[d][b].adj<20000&&P[a][b]) 
          {
            printf("-->%s",G.vex[b].sight); 
            q=q+1;       
            P[a][b]=0;
            d=b;       
            if(q%8==0) printf("n");
            goto gate;
          }
        }
  }
  }
 
}
void HaMiTonian(int m)   
{
  if(m>8)    return;   
L: NextValue(m);   
    if(x[m]==0)   
      return;   
    if(m==7&&G.arcs[0][x[8]-1].adj!=20000)   
      display();   
    else   
      HaMiTonian(m+1);   
    goto    L;   
}
void NextValue(int k)   
 
  int j;   
l:x[k]=(x[k]+1)%10;   
  if(x[k]==0)   
    return;   
  if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000)   
   
    for(j=0;j<k;j++)   
      if(x[j]==x[k])   
        goto l;   
      return;           
   
  else   
    goto l;           
 
void display()   
 
  int i=0;
  printf("nnt");
  for(i=0;i<8;i++)   
  printf("%s->",G.vex[x[i]-1].sight);   
  printf("出口");
  printf("n");
 


 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值