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; }