数据结构课程设计大作业——江大公交路线查询系统
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 代码
- 总结
前言
参考资料【C++期末大作业】数据结构课设 | 智能公交车查询系统_米莱虾的博客-CSDN博客_c++期末大作业
Dijkstra算法详解(完美图解、趣学算法)_wjyGrit的博客-CSDN博客_dijkstra
正文
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
#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<g.vexnum;i++)fscanf(fp,"%s",g.vertex[i]);for(int i=0;i<g.vexnum;i++){for(int j=0;j<g.vexnum;j++)g.arc[i][j]=Inf;} fscanf(fq,"%d",&g.arcnum); //导入边集 int u,v;for(int i=0;i<g.arcnum;i++){fscanf(fq,"%d %d",&u,&v);fscanf(fq,"%d",&g.arc[u][v]);g.arc[v][u]=g.arc[u][v];}}void exchange() //将公交站在公交线的顺序记录在表中 ,并且表示公交站与公交线的关系
{int k;for(int i=0;i<busnmb;i++){for(k=0;k<bus[i].stationnum;k++)for(int j=0;j<maxstation;j++)if(strcmp(bus[i].stnname[k],station[j])==0)way[i][j]=k+1;}for(int i=0;i<stanmb;i++) //将公交站在图顶点集中的位置记录下来 {for(int j=0;j<g.vexnum;j++)if(strcmp(station[i],g.vertex[j])==0){versta[i]=j;}}
}void init() //初始化 //初始化
{FILE *fp,*fq;if((fp=fopen("Station.txt","r"))==NULL){printf("站点读取错误");exit(0); } if((fq=fopen("busline.txt","r"))==NULL){printf("公交线读取错误");exit(0);}fscanf(fp,"%d",&stanmb); //导入公交站集合 for(int i=0;i<stanmb;i++)fscanf(fp,"%s",station[i]);for(int i=0;i<maxbus;i++) //导入公交线信息 {fscanf(fq,"%d %d",&bus[i].busnum,&bus[i].stationnum);if(bus[i].busnum!=0){busnmb++;for(int j=0;j<bus[i].stationnum;j++){fscanf(fq,"%s",bus[i].stnname[j]);}}else break; }initG();exchange();
}void Printbusline(int n) //输出某条公交线所有的站点
{printf("%d号线站点为:",bus[n].busnum); for(int i=0;i<bus[n].stationnum;i++)printf("%5s ",bus[n].stnname[i]);printf("\n\n");
}void PrintAllbusline() //输出所有公交线的站点
{for(int i=0;i<busnmb;i++){if(bus[i].busnum!=0){Printbusline(i);printf("\n");}}
}
void stationsearch() //查找站点所属的公交线并输出
{char n[20];printf("\n请输入当前站点:\n");scanf("%s",n);int i,j;for(i=0;i<stanmb;i++)if(strcmp(n,station[i])==0)break;int ret=0;for(j=0;j<busnmb;j++){if(way[j][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<busnmb;i++){if(way[i][a]>0)u=i;if(way[i][b]>0)v=i;}int t; int i;for(i=0;i<stanmb;i++) //找到换乘站点 if(way[u][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<stanmb;i++){if(strcmp(station[i],m)==0)a=i;if(strcmp(station[i],n)==0)b=i;}int ret=0;for (int i=0;i<busnmb;i++){if(way[i][a]>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<n;i++){dist[i]=g.arc[u][i];flag[i]=false;if(dist[i]==Inf)p[i]=-1;elsep[i]=u;}flag[u]=true;dist[u]=0;for(int i=0;i<n;i++){int temp=Inf,t=u;for(int j=0;j<n;j++){if(!flag[j]&&dist[j]<temp){t=j;temp=dist[j];}}if(t==u) return;flag[t]=true;for(int j=0;j<n;j++){if(!flag[j]&&g.arc[t][j]<Inf){if(dist[j]>(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<stanmb;i++){if(strcmp(g.vertex[i],m)==0)a=i;if(strcmp(g.vertex[i],n)==0)b=i;}dijstra(a);printf("\n%s到%s的步行最短距离大约是%d米\n",m,n,dist[b]);}
int nearsta(int a)
{dijstra(a);int near,less=999; for (int i=0;i<stanmb;i++){if(less>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.vexnum;i++){if(strcmp(start,g.vertex[i])==0)s=i; }printf("\n请输入终点站: ");scanf("%s",end);for(int i=0;i<g.vexnum;i++){if(strcmp(end,g.vertex[i])==0)e=i;}n1=nearsta(s);n2=nearsta(e);for(int i=0;i<stanmb;i++){if(strcmp(g.vertex[n1],station[i])==0){strcpy(m,station[i]);}if(strcmp(g.vertex[n2],station[i])==0){strcpy(n,station[i]);}}Link(m,n);
}
void Wks()
{int i,n;for(i=0;i<g.vexnum;i++){if(strcmp("五棵松",g.vertex[i])==0){n=i;break;} }dijstra(n);int x;for(i=0;i<g.vexnum;i++){x=p[i];printf("%s->",g.vertex[i]);for(int j=0;j<g.vexnum;j++){printf("%s->",g.vertex[x]);x=p[x];if(x==p[x])break; }printf("五棵松\n五棵松到%s的距离是%d\n\n\n",g.vertex[i],dist[i]);}
}
void writebusline() //重新写入公交线文件
{FILE *fp;fp=fopen("busline.txt","w");for(int i=0;i<busnmb;i++){fprintf(fp,"%d %d\n",bus[i].busnum,bus[i].stationnum);for(int j=0;j<bus[i].stationnum;j++){fprintf(fp,"%s\n",bus[i].stnname[j]);}}}
void writestation() //重新写入公交站文件
{FILE *fp;fp=fopen("Station.txt","w");fprintf(fp,"%d\n",stanmb); for(int i=0;i<stanmb;i++){fprintf(fp,"%s\n",station[i]);}
}
void newarc(char a[20],char b[20]){int m,n;for(int i=0;i<g.vexnum;i++){if(strcmp(a,g.vertex[i])==0)m=i;if(strcmp(b,g.vertex[i])==0)n=i;}if(g.arc[m][n]==Inf){printf("请输入两个站点之间的距离:");scanf("%d",&g.arc[m][n]);FILE *fp;fp=fopen("graph.txt","a");fprintf(fp,"%d\n",g.arc[m][n]) ;}else{printf("两站点距离信息已有"); }
}
void Newbusline() //新增公交线
{int n=busnmb;bus[n].busnum=n+1;printf("\n新建公交线将为%d号线\n",bus[n].busnum); printf("请输入新建公交线信息\n"); printf("\n站点数:");scanf("%d",&bus[n].stationnum);for(int i=0;i<bus[n].stationnum;i++){if(i==0)printf("请输入首发站: ");elseprintf("请输入下一站: ");scanf("%s",bus[n].stnname[i]); {newarc(bus[n].stnname[i],bus[n].stnname[i-1]);}}FILE *fp;fp=fopen("busline.txt","a");fprintf(fp,"%d %d\n",bus[n].busnum,bus[n].stationnum);for(int i=0;i<bus[n].stationnum;i++){fprintf(fp,"%s\n",bus[n].stnname[i]);}busnmb++;
}
void modibusline() //修改公交线的站点
{int n,m;char u[20],v[20];printf("输入想要修改的公交线:\n");scanf("%d",&n);Printbusline(--n);printf("请输入需要修改的站点:\n");scanf("%s",u);for(int i=0;i<bus[n].stationnum;i++) //找到要修改的站点 if(strcmp(bus[n].stnname[i],u)==0)m=i;printf("请输入修改后的站点名:\n");scanf("%s",v);strcpy(bus[n].stnname[m],v);Printbusline(n);
}
void deleteStation() //删除公交站点
{char n[20]; int k[20]={0};printf("输入要删除的站点:");scanf("%s",n);for(int i=0;i<stanmb;i++) //将公交站在站点合集中覆盖 {if(strcmp(station[i],n)==0){for(int j=i;j<stanmb-1;j++){strcpy(station[j],station[j+1]);}stanmb--;break;}} for(int i=0;i<busnmb;i++) //找到该站点原本属于的公交线,并将其从中删除 for(int j=0;j<bus[i].stationnum;j++){if(strcmp(bus[i].stnname[j],n)==0)k[i]=j;}for(int i=0;i<busnmb;i++){if(k[i]>0){for(int j=k[i];j<bus[i].stationnum-1;j++){strcpy(bus[i].stnname[j],bus[i].stnname[j+1]);}printf("已将%s从%d号线中删除",n,bus[i].busnum);}bus[i].stationnum--;}}void AddStation()
{int u,v=0,w; //u记录新增站点所在公交线,v记录该站点是否属于原来的站点合集 printf("请输入新增站点所属的公交线");scanf("%d",&u);u--;Printbusline(u);char n[20],m[20];printf("请输入需要增加的站点名:\n"); scanf("%s",n);printf("请输入它的前一站站点名:\n");scanf("%s",m);for(int i=0;i<stanmb;i++) //如果是不属于原来的站点合集,则将新站点加入站点合集 if(strcmp(station[i],n)==0){v=1;break;}if(v==0){FILE *fp;fp=fopen("Station.txt","a");fprintf(fp,"%s\n",n);strcpy(station[stanmb],n);stanmb++;}for(int i=0;i<bus[u].stationnum;i++) //将原有站点向后移动一格,新站点添加到前一站之后 {if(strcmp(bus[u].stnname[i],m)==0)w=i;}w++;for(int j=bus[u].stationnum;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;}
总结
数据结构课程设计大作业——江大公交路线查询系统相关推荐
- 公交线路图查询系统c语言,公交路线查询系统(基于数据结构和C语言)完整
公交路线查询系统(基于数据结构和C语言)完整 #include #include #include #include #define max 30 #define len 20 #define MAX ...
- php 公交 查询系统,php定做单城市公交路线查询系统
本人通过调查乌鲁木齐市的公交状况,发现使用公交路线查询系统的人群主要是两大人群:城市居民和公交管理员.而城市居民想要的功能是:可以查找车次,可以查找经过改站点的公交车,两站的换乘以及对公交车站提意见. ...
- 数据结构课程设计-利用散列表做一个电话号码查找系统
[基本要求] (1)设每个记录有下列数据项:电话号码.用户名.地址: (2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表: (3)采用一定的方法解决冲突: (4)查找并显示给定电话号码的 ...
- 数据结构课程设计(四):行车路线问题(C++、图、迪杰斯特拉算法、最短路径)
题目要求 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公 ...
- 公交查询系统c语言数据结构,公交路线查询系统(基于数据结构和C语言)
该系统可用于查询公交线路,有多种方式,如查询某条线路上的各个站点.换乘最少的线路.站最少的线路等. #include #include #include #include #define max 30 ...
- ssm+java计算机毕业设计公交路线查询系统l1auz(程序+lw+源码+远程部署)
项目运行 项目含有源码(见文末).文档.程序.数据库.配套开发软件.软件安装教程 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ E ...
- C/C++数据结构课程设计安排
C/C++数据结构课程设计安排 数据结构课程设计安排 课程设计学时:32学时 课程设计目的:综合应用数据结构课程中所学的数据结构:线性表.栈.队列.数组.广义表.树.二叉树.图.查找表中的一种或多种数 ...
- HTML5+CSS期末大作业:运动体育网站设计主题——体育铅球(5页)带注册 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品...
常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 明星. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 军 ...
- HTML5期末大作业:中国传统节日网页设计——端午节(9个页面) HTML+CSS+JavaScript 节日网页HTML代码 学生网页课程设计期末作业下载...
HTML5期末大作业:中国传统节日网站设计--端午节(9个页面) HTML+CSS+JavaScript 节日网页HTML代码 学生网页课程设计期末作业下载 临近期末, 你还在为HTML网页设计结课作 ...
最新文章
- Spring Boot 关于 @Import注解 —— 导入资源
- ros 工作流程图4
- 概率论与数理统计中的算子半群 第一讲 Banach-Steinhaus定理1 Baire‘s Category与Banach-Steinhaus定理的证明
- Android 中 RegistrantList消息处理机制 以android 5.0 MT为例
- 电子产品的磨砂膜和镜面膜的选择
- stm32 复位到内部bootloader
- js jQuery取消添加超链接的方法小结
- CodeVS 1081 线段树练习 2
- C语言编程规范 clean code
- 总奖池25万!百度AI Studio人工智能竞赛火热报名中
- Android ContentProvider 内容提供者
- php bloginfo templatedirectory,PHP变量不显示使用bloginfo('template_directory')的图像
- 京东发布全球物流无人机研报:美国领先、非洲政策最开放,中国产业链全景最复杂...
- apache环境下web站点禁止用服务器ip访问
- oracle adrci purge,adrci中的purge
- docker mysql域名访问_Docker中配置MySQL并实现远程访问
- 聚类和分类算法的区别
- 复盘模型_如何运用MT4软件进行复盘,提高水平
- python爬取贴吧数据_【python】利用requests爬取百度贴吧用户信息
- 使用Java写入Excel下拉选择框选项过多不显示问题