文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 代码
- 总结
前言
参考资料【C++期末大作业】数据结构课设 | 智能公交车查询系统_米莱虾的博客-CSDN博客_c++期末大作业
Dijkstra算法详解(完美图解、趣学算法)_wjyGrit的博客-CSDN博客_dijkstra
正文
#include#include #include #include #define maxstation 100 #define maxbus 20 #define Inf 65535 char station[maxstation][20]; int stanmb=0; //总站点数 int busnmb=0; //总公交线数 int way[maxbus][maxstation]={{0}}; //记录公交顺序 int versta[maxstation]; //记录公交站对应的图顶点位置 typedef struct { char vertex[maxstation][20]; //顶点合集 int arc[maxstation][maxstation]; //边合集且为权值 int vexnum,arcnum; //顶点数和边数 }graph; typedef struct { int busnum; //公交车序号 char stnname[maxstation][20]; //站点名 int stationnum; //站点数量 }busline; graph g; busline bus[maxbus]; bool flag[maxstation]; //dijstra预留空间 int dist[maxstation],p[maxstation]; void initG() //图的初始化 { FILE *fp,*fq; if((fp=fopen("Vertex.txt","r"))==NULL) {printf("地点读取错误"); exit(0); } if((fq=fopen("graph.txt","r"))==NULL) {printf("路线读取错误"); exit(0); } fscanf(fp,"%d",&g.vexnum); //导入顶点集 for(int i=0;i 0) { printf("该站点属于%d号线n",bus[j].busnum); Printbusline(j); } else ret++; } if(ret==busnmb) printf("该站点不属于任何公交线"); } void change(int a,int b) //换乘 { int u,v; //找到两个站点分别属于哪条公交线 for(int i=0;i 0) u=i; if(way[i][b]>0) v=i; } int t; int i; for(i=0;i 0&&way[v][i]>0) { t=way[u][i]-way[u][a]+way[v][i]-way[v][b]; break;} printf("n在%s乘坐%d号线到达%s后,n换乘%d号线到达%s耗时约为%d分钟n",station[a],bus[u].busnum,station[i],bus[v].busnum,station[b],(t)); } void Link(char m[20],char n[20]) //直达 { int a,b; for (int i=0;i 0&&way[i][b]>0) { int t=way[i][a]-way[i][b]; printf("n%s到%s有直达线%d号线,耗时约为%d分钟n",m,n,bus[i].busnum,abs(t)); ret++; } } if(ret==0) change(a,b); } void dijstra(int u) //dijstra 算法 { int n=g.vexnum; for(int i=0;i (dist[t]+g.arc[t][j])) { dist[j]=dist[t]+g.arc[t][j]; p[j]=t; } } } } } void walk() //步行距离查询 { char m[20],n[20]; printf("n请输入起点:"); scanf("%s",m); printf("n请输入终点:"); scanf("%s",n); int a,b; for (int i=0;i dist[versta[i]]) { near=versta[i]; less=dist[versta[i]]; } } printf("n%s最近的站点是%s,步行距离为%d,所需时间为%d分钟n",g.vertex[a],g.vertex[near],less,(less/50)); return near; } void Mtplan() { char start[20],end[20]; int s,e; // 记录起点终点对应的值 int n1,n2; //记录最近站点对应的值 char m[20],n[20]; //记录最近的站点名字 printf("n请输入起点站: "); scanf("%s",start); for(int i=0;i ",g.vertex[i]); for(int j=0;j ",g.vertex[x]); x=p[x]; if(x==p[x])break; } printf("五棵松n五棵松到%s的距离是%dnnn",g.vertex[i],dist[i]); } } void writebusline() //重新写入公交线文件 { FILE *fp; fp=fopen("busline.txt","w"); for(int i=0;i 0) { for(int j=k[i];j w;j--) { strcpy(bus[u].stnname[j],bus[u].stnname[j-1]) ; } strcpy(bus[u].stnname[w],n); bus[u].stationnum++; } void menu1() { int select1=0,select2=1; printf("******************管理端***********************n"); printf("* 1.新增公交线 *n"); printf("* 2.修改公交线 *n"); printf("* 3.删除站点 *n"); printf("* 4.增加站点 *n"); printf("* 9.退出 *n"); printf("***********************************************n"); scanf("%d",&select1); switch(select1) { case 1: while(select2) { Newbusline(); init(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 2: while(select2) { modibusline(); writebusline(); init(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 3: while(select2) { deleteStation(); writestation(); writebusline(); init(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); }break; case 4: while(select2) { AddStation(); writebusline(); init(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; } if(select1>0&&select1<9) menu1(); } void menu0() { int select1,select2=1; printf("******************学生端***********************n"); printf("* 1.查询站点公交信息 *n"); printf("* 2.查询所有公交路线信息 *n"); printf("* 3.公交站点换乘规划 *n"); printf("* 4.步行路程最短距离 *n"); printf("* 5.步行和公交最少耗时规划 *n"); printf("* 6.五棵松到所有站点路程 *n"); printf("* 9.退出 *n"); printf("***********************************************n"); scanf("%d",&select1); switch(select1) { case 1: while(select2) { stationsearch(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 2: while(select2) { PrintAllbusline(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 3: while(select2) { char m[20],n[20]; printf("n请输入起点:"); scanf("%s",m); printf("n请输入终点:"); scanf("%s",n); Link(m,n); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 4: while(select2) { walk(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 5: while(select2) { Mtplan(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; case 6: while(select2) { Wks(); printf("n是否继续?n1.继续 0.退出n"); scanf("%d",&select2); } break; } if(select1>0&&select1<9) menu0(); else if(select1==666) menu1(); } int main() { init(); menu0(); return 0; }
总结



