C语言实现导航功能

  #include

  #include

  #define NUM 25

  #define INFINITY 32767

  #define False 0

  #define True 1

  typedef struct

  {

  int number;//顶点的编号

  const char *sight;//顶点的信息

  } VertexType;//顶点的类型

  typedef struct

  {

  VertexType vex[NUM];//存放顶点信息

  int arcs[NUM][NUM];//邻接矩阵数组

  int vexnum;//顶点个数

  }MGraph;

  MGraph G;

  /**

  由传入的节点个数创建图

  **/

  void GreateMGraph(int v)

  {

  G.vexnum=v;//传入节点个数

  for(int i=1;i

  G.vex[i].number=i;

  }//配置顶点编号

  /**

  编辑顶点信息

  **/

  G.vex[0].sight="各景点名字";

  G.vex[1].sight="大门口";

  G.vex[2].sight="行政办公楼";

  G.vex[3].sight="北区教室实训中心";

  G.vex[4].sight="一号教学楼";

  G.vex[5].sight="二号教学楼";

  G.vex[6].sight="实验楼";

  G.vex[7].sight="三号教学楼";

  G.vex[8].sight="图书馆";

  G.vex[9].sight="开水房";

  G.vex[10].sight="超市";

  G.vex[11].sight="榴馨苑";

  G.vex[12].sight="洗浴中心";

  G.vex[13].sight="骊秀苑";

  G.vex[14].sight="综合楼";

  G.vex[15].sight="游泳池";

  G.vex[16].sight="主田径场";

  G.vex[17].sight="综合文体馆";

  /**

  先将所有顶点之间的距离设置为INFINITY

  **/

  for(int i=1;i<=G.vexnum;i++)

  {

  for(int j=1;j<=G.vexnum;j++)

  {

  G.arcs[i][j]=INFINITY;

  }

  }

  /**

  设置各顶点之间的距离

  **/

  G.arcs[1][2]=G.arcs[2][1]=255;

  G.arcs[1][4]=G.arcs[4][1]=501;

  G.arcs[1][5]=G.arcs[5][1]=535;

  G.arcs[1][6]=G.arcs[6][1]=705;

  G.arcs[1][7]=G.arcs[7][1]=722;

  G.arcs[1][8]=G.arcs[8][1]=790;

  G.arcs[2][3]=G.arcs[3][2]=530;

  G.arcs[2][4]=G.arcs[4][2]=450;

  G.arcs[2][5]=G.arcs[5][2]=484;

  G.arcs[2][6]=G.arcs[6][2]=654;

  G.arcs[2][7]=G.arcs[7][2]=663;

  G.arcs[2][8]=G.arcs[8][2]=748;

  G.arcs[3][8]=G.arcs[8][3]=1054;

  G.arcs[3][17]=G.arcs[17][3]=713;

  G.arcs[4][5]=G.arcs[5][4]=436;

  G.arcs[4][6]=G.arcs[6][4]=158;

  G.arcs[4][7]=G.arcs[7][4]=527;

  G.arcs[4][8]=G.arcs[8][4]=534;

  G.arcs[5][6]=G.arcs[6][5]=688;

  G.arcs[5][7]=G.arcs[7][5]=561;

  G.arcs[5][8]=G.arcs[8][5]=603;

  G.arcs[6][7]=G.arcs[7][6]=428;

  G.arcs[6][8]=G.arcs[8][6]=329;

  G.arcs[6][9]=G.arcs[9][6]=547;

  G.arcs[7][8]=G.arcs[8][7]=254;

  G.arcs[8][11]=G.arcs[11][8]=421;

  G.arcs[8][17]=G.arcs[17][8]=879;

  G.arcs[9][10]=G.arcs[10][9]=178;

  G.arcs[10][11]=G.arcs[11][10]=213;

  G.arcs[10][12]=G.arcs[12][10]=114;

  G.arcs[12][13]=G.arcs[13][12]=415;

  G.arcs[13][14]=G.arcs[14][13]=104;

  G.arcs[13][16]=G.arcs[16][13]=427;

  G.arcs[13][15]=G.arcs[15][13]=576;

  G.arcs[14][17]=G.arcs[17][14]=688;

  G.arcs[15][16]=G.arcs[16][15]=213;

  G.arcs[16][17]=G.arcs[17][16]=214;

  }

  /**

  展示校园地图

  **/

  void Map()

  {

  printf("

  ");

  printf("  **************************河南财经政法大学*******************************");

  printf("

  ");

  printf("                               ------------------------15游泳池

  ");

  printf("                               |                          |

  ");

  printf("                               |                          |

  ");

  printf("   12洗浴中心----------------13骊绣苑---------------------16主田径场

  ");

  printf("       |                       |                          |

  ");

  printf("   10超市----11榴馨苑          14综合楼                   |

  ");

  printf("    |          |                |----------------------17综合文体馆

  ");

  printf("   9开水房     |                                            |

  ");

  printf("    |          ------------8图书馆--------------------------|

  ");

  printf("    |                          |                            |

  ");

  printf("    |-------------6实验楼------|--------7三号教学楼         |

  ");

  printf("                     |         |              |             |

  ");

  printf("                     |         |              |             |

  ");

  printf("              4一号教学楼------|--------5二号教学楼         |

  ");

  printf("                               |                            |

  ");

  printf("                               |                            |

  ");

  printf("                               |---2行政楼---------------3北区

  ");

  printf("                               |

  ");

  printf("                               |

  ");

  printf("                              1大门口

  ");

  }

  /**

  介绍校园各景点概况

  **/

  void Info(int sight_num,char data[][200])

  {

  if(sight_num==1)

  puts(data[1]);

  if(sight_num==2)

  puts(data[2]);

  if(sight_num==3)

  puts(data[3]);

  if(sight_num==4)

  puts(data[4]);

  if(sight_num==5)

  puts(data[5]);

  if(sight_num==6)

  puts(data[6]);

  if(sight_num==7)

  puts(data[7]);

  if(sight_num==8)

  puts(data[8]);

  if(sight_num==9)

  puts(data[9]);

  if(sight_num==10)

  puts(data[10]);

  if(sight_num==11)

  puts(data[11]);

  if(sight_num==12)

  puts(data[12]);

  if(sight_num==13)

  puts(data[13]);

  if(sight_num==14)

  puts(data[14]);

  if(sight_num==15)

  puts(data[15]);

  if(sight_num==16)

  puts(data[16]);

  if(sight_num==17)

  puts(data[17]);

  if(sight_num==18)

  puts(data[18]);

  if(sight_num==19)

  puts(data[19]);

  if(sight_num==20)

  puts(data[20]);

  if(sight_num==21)

  puts(data[21]);

  if(sight_num==22)

  puts(data[22]);

  if(sight_num==23)

  puts(data[23]);

  if(sight_num==24)

  puts(data[24]);

  if(sight_num==25)

  puts(data[25]);

  }

  /**

  开始菜单

  **/

  int Menu()

  {

  int c;

  Map();

  printf(" 欢迎使用河南财经政法大学导航图系统

  ");

  printf(" 1.查询地点路径

  ");

  printf(" 2.地点信息简介

  ");

  printf(" 3.退出

  ");

  printf("  **************************河南财经政法大学*******************************

  ");

  printf("请输入您的选择:");

  scanf("%d",&c);

  return c;

  }

  /**

  地图的导航功能

  **/

  /**

  输出任意两点之间的最短路径

  **/

  void guide_Dispath_two(MGraph g,int dist[],int path[],int S[],int v,int i)//v为起点,i为终点

  {

  int apath[NUM],d=0;             //存放一条最短的路径以及顶点个数(路径中终点为首)

  int j,k;                          //k用来存放终点的前面的节点

  if(S[i]==1 && i!=v)

  {

  printf("从顶点%d到顶点%d的路径长度为:%d 路径为:",v,i,dist[i]);

  apath[d]=i;                //把终点放在数组中的首位

  k=path[i];

  if(k==-1)

  printf("无路径");

  /**

  利用循环将最短路径中的各节点存入apath数组

  **/

  else

  {

  while(k!=v)

  {

  d++;

  apath[d]=k;

  k=path[k];

  }

  }

  d++; apath[d]=v;         //将起点添加进去

  printf("%d",apath[d]);   //输出起点

  for(j=d-1;j>=0;j--)

  {

  printf("->%d",apath[j]); //循环输出最短路径中的各节点

  }

  }

  }

  //以编号为v的顶点为起点,w为终点

  void guide_Dijkstra(MGraph g,int v,int w)

  {

  int dist[NUM],path[NUM];

  int S[NUM];                         //S[i]=1表示顶点i在S中,S[i]=0表示顶点i在U中

  int MINdis,i,j,u;

  for(i=1;i<=g.vexnum;i++)

  {

  dist[i]=g.arcs[v][i];           //距离初始化(距顶点v的距离)

  S[i]=0;                         //S[]置空

  if(g.arcs[v][i]

  path[i]=v;                  //顶点v到顶点i有边时,置顶点i的前一个顶点为顶点v

  else

  path[i]=-1;                 //顶点v到顶点i没边时,置顶点i的前一个顶点为-1

  }

  S[v]=1;path[v]=0;                  //源点编号v放入S中

  for(i=1;i<=g.vexnum-1;i++)          //循环直到所有顶点的最短路径都求出

  {

  MINdis=INFINITY;                //MINdis置最大长度初值

  for(j=1;j<=g.vexnum;j++)       //选取不在S中(即U中)且具有最小最短路径长度的顶点u

  {

  if(S[j]==0 && dist[j]

  {

  u=j;

  MINdis=dist[j];

  }

  }

  S[u]=1;                   //顶点u加入S中

  for(j=1;j<=g.vexnum;j++)  //修改不在S中(即U中)的顶点的最短路径

  {

  if(S[j]==0)

  if(g.arcs[u][j]

  {

  dist[j]=dist[u]+g.arcs[u][j];

  path[j]=u;

  }

  }

  }

  guide_Dispath_two(g,dist,path,S,v,w); //输出最短路径

  }

  /**

  将文件中的景点信息载入数组

  **/

  void load_sight_data(char data[][200],MGraph g)

  {

  FILE *fp;

  int i;

  if((fp=fopen("C:UsersadminDesktop导航sight_data.txt","r"))==NULL){

  printf("File can't open");

  return;

  }

  for(i=1;i<=g.vexnum;i++)

  {

  fgets(data[i],200,fp);

  }

  fclose(fp);

  }

  /**

  修改景点信息

  **/

  void change_sight_data(char user_change_data[200],MGraph g)

  {

  FILE *fin,*ftp;

  int i;

  fin=fopen("C:UsersadminDesktop导航sight_data.txt","r");//读打开原文件

  ftp=fopen("C:UsersadminDesktop导航 emp.txt","w");//写打开临时文件

  if(fin==NULL || ftp==NULL)

  {

  printf("打开文件失败");

  return;

  }

  for(i=1;i<=g.vexnum;i++)

  {

  char change_data[200];

  fgets(change_data,200,fin);

  if(change_data[0]==user_change_data[0] && change_data[1]==user_change_data[1])

  {

  fputs(user_change_data,ftp);//而用fputs直接将user_change_data直接写入文件没有换行符,需要添加换行符

  fprintf(ftp,"

  ");

  }

  else

  {

  fputs(change_data,ftp);//在使用fgets函数得到change_data数组时换行符会被保存,此处不需要加换行符

  }

  }

  fclose(fin);

  fclose(ftp);

  remove("C:UsersadminDesktop导航sight_data.txt");

  rename("C:UsersadminDesktop导航 emp.txt","C:UsersadminDesktop导航sight_data.txt");

  }

  /**

  增添景点到文件内

  **/

  void add_sight_data(char change_data[200],MGraph g)

  {

  FILE *fp;

  if((fp=fopen("C:UsersadminDesktop导航sight_data.txt","a"))==NULL){

  printf("File can't open");

  return;

  }

  fprintf(fp,"

  ");

  fputs(change_data,fp);

  fprintf(fp,"

  ");

  rewind(fp);

  fclose(fp);

  }

  /**

  修改密码,保存到密码文件中

  **/

  void change_password(char password[30])

  {

  FILE *fp;

  fp=fopen("C:UsersadminDesktop导航password_temp.txt","w");

  if(fp==NULL)

  {

  printf("打开文件失败");

  return;

  }

  fputs(password,fp);

  fclose(fp);

  remove("C:UsersadminDesktop导航password.txt");

  rename("C:UsersadminDesktop导航password_temp.txt","C:UsersadminDesktop导航password.txt");

  }

  /**

  将密码装进密码数组中

  **/

  void load_password(char password[30])

  {

  FILE *fp;

  if((fp=fopen("C:UsersadminDesktop导航password.txt","r"))==NULL){

  printf("File can't open");

  return;

  }

  fgets(password,30,fp);

  fclose(fp);

  }

  int admin_Menu()

  {

  int c;

  printf("**************管理系统****************

  ");

  printf(" 欢迎使用管理员操作系统

  ");

  printf("1.修改登录密码

  ");

  printf("2.添加新景点

  ");

  printf("3.修改景点信息

  ");

  printf("4.新建景点路径

  ");

  printf("5.退出

  ");

  printf("**************************************

  ");

  printf("请输入您的选择:");

  scanf("%d",&c);

  return c;

  }

  int main()

  {

  GreateMGraph(17);

  char sight_data[NUM][200];

  char password[30];

  int choice;

  int Menu_choice;

  int start,end;

  do

  {

  printf("欢迎使用河南财经政法大学导航系统

  ");

  printf("请问您的身份是:1.管理员  2.游客  3.退出

  ");

  scanf("%d",&choice);

  if(choice==2)

  {

  do

  {

  Menu_choice=Menu();

  if(Menu_choice==1)

  {

  printf("请输入您现在的位置:");

  scanf("%d",&start);

  printf("

  ");

  printf("请输入您想要到达的位置:");

  scanf("%d",&end);

  guide_Dijkstra(G,start,end);

  }

  if(Menu_choice==2)

  {

  int sight_num;

  load_sight_data(sight_data,G);

  printf("请输入您要查询的景点编号:");

  scanf("%d",&sight_num);

  Info(sight_num,sight_data);

  }

  if(Menu_choice==3)

  {

  break;

  }

  }while(1);

  }

  if(choice==1)

  {

  getchar();

  load_password(password);

  char user_input_psw[30];

  printf("请输入管理员登录密码:");

  gets(user_input_psw);

  if(strcmp(password,user_input_psw)==0)

  {

  printf("密码正确!

  ");

  int admin_choice;

  do

  {

  admin_choice=admin_Menu();

  if(admin_choice==1)

  {

  getchar();

  char user_change_psw[30];

  printf("请输入新的密码:

  ");

  gets(user_change_psw);

  change_password(user_change_psw);

  load_password(password);

  printf("密码修改成功!

  ");

  }

  if(admin_choice==2)

  {

  getchar();

  char uadd_sight_data[200];

  printf("请输入您要添加的景点以及该景点信息:

  ");

  gets(uadd_sight_data);

  add_sight_data(uadd_sight_data,G);

  load_sight_data(sight_data,G);

  G.vexnum++;

  char *p;

  p=strtok(uadd_sight_data," ");

  p=strtok(NULL," ");

  G.vex[G.vexnum].number=G.vexnum;

  G.vex[G.vexnum].sight=p;

  printf("添加成功!

  ");

  }

  if(admin_choice==3)

  {

  getchar();

  char user_sight_data[200];

  printf("请输入您要修改的景点信息:

  ");

  gets(user_sight_data);

  change_sight_data(user_sight_data,G);

  load_sight_data(sight_data,G);

  printf("修改成功!

  ");

  }

  if(admin_choice==4)

  {

  int new_start,new_end;

  int length;

  printf("请输入您想要在哪两点之间添加路线:

  ");

  printf("起点:");

  scanf("%d",&new_start);

  printf("

  ");

  printf("终点:");

  scanf("%d",&new_end);

  printf("请输入两顶点之间的距离:

  ");

  scanf("%d",&length);

  printf("

  ");

  G.arcs[new_start][new_end]=G.arcs[new_end][new_start]=length;

  printf("路线添加成功!

  ");

  }

  if(admin_choice==5)

  {

  break;

  }

  }while(1);

  }

  if(strcmp(password,user_input_psw)!=0)

  {

  printf("密码错误!

  ");

  }

  }

  if(choice==3)

  {

  break;

  }

  }while(1);

  return 0;

  }