数据结构公交路线管理模拟系统.docx
《数据结构公交路线管理模拟系统.docx》由会员分享,可在线阅读,更多相关《数据结构公交路线管理模拟系统.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构公交路线管理模拟系统
数据结构》课程设计报告
一、课程设计名称公交线路管理模拟系统
、实用工具软件
MicrosoftvisualC++6.0
三、课程设计内容简介
1、实践目的
1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;
2)、掌握上机实现图的基本方法;
3)、掌握有关图的操作并用高级语言编程实现;
4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;
5)、掌握图的常见应用算法的思想及其程序实现。
2、实践要求
1)、掌握本章实践的算法;
2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;
3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;
4)、注意理解各算法实现时所采用的存储结构;
5)、注意正、逆邻接表。
3、系统简介及设计思路本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路
线信息和删除公交路线信息等功能
本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。
而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。
所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。
因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。
因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。
4、程序设计流程
为了创建公交路线,首先建立结构体载入公交车的相关信息:
名称、司机、起始站、终点站、站数以及距离。
利用邻接表把站点与站点之间的信息储存起来。
用文件详细记载了路线信息,便于管理者初始化公交路线信息。
再构造子函数来创建、及时修改、插入、删除公交信息、以及查询公交路线是否出错,各站点之间的距离。
用主函数来调用子函数,进入导航系统而进行操作。
导航查询(initial)流程
新建(newb)流程
修改路线(Modifyr)流程
删除汽车(delb)流程
5、运行环境
代码用C语言完成,布置在MicrosoftvisualC++6.0运行。
MicrosoftvisualC++6.0具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。
整合了便利的除错工具,特别是整合了微软视窗程式设计(WindowsAPI)、三维动画DirectXAPI,
Microsoft.NET框架。
*欢迎使用公汽査询系统丫六
输入如下公交线路信息
證询汽SWb务
任查查^1?
栗旷襄建1仝出刪ABcDEF
13
6
1
9
15
5
12
14
16
1路2路3路
4路
5路
A10001
A10002
A10003
A10004
A10005
司机16
司机26
司机36
司机46
司机57
001—>2—>3—>4—>5
156—>7—>4—>8—>17—>12
009—>7—>3—>10—>12
306—>13—>1—>12—>14—>17
0015—>5—>8—>16—>10—>2—>13
创建示意图(1路)
刨建新呑汽■
備输入新仝汽号=
请输入撅路线发车盯间
HR
情输入新路线总站舍数<>=?
>
晴输入必汽第丄站合名称次
晴输入舍汽第H站白名称泊
请输入沦汽第3站的名称=3
请输入益汽第理站自答称池
谯输入必汽第5站舍名称汚
悻小凹01■号公汽创建成功T
您想、纟鏗妻新建退出刨建细》请选择AN
创建结束选择N回到主菜单,再选择A(导航查询)
主菜单下选择B(公汽查询)就可以查询已有的公交信息,查询方式有公汽号查询、站台查询两种查询方式
我们以公汽号查询(查询津A10001)为例:
请输入要查询的公汽号’
:
公汽号’vtfi10001站数:
5发车时间’6:
06ftrt司机:
司机1
路线:
1>2>3>4>5
津口10胸1号公汽查询成功!
您想继续查询“〉退岀查询细》请选择A或N
返回到主菜单,选择D进入系统管理
务團負序任单r路公公程一粟择專改改笛选里無壬修傷删退请管
baBcP
我们以修改路线为例(修改津A10001)
请输入要修改路线的公汽号;
津口丄腼血
司机姓名:
司机i
请修改路线总站台数<>=2>
3
请输入公汽第1站台名称汀
请输入公汽第2站台名称汁
请输入公汽第M站台名称汚
自动生成修改后的路线丄r…-->3">5
律白1酮血号公汽修改成功!
您想继续修改"〉退岀修改他〉请选择A或H
最后在主菜单下选择E(清空数据)
最后选择F即可退出程序
四、得意与不足之处:
1、得意之处:
1)、可以根据题目需要翻阅图书馆资料自学C++程序,完成代码。
2)、完成过程中思路清晰,可以根据实际进行分析设计、编程调试,能够熟练应用软件的分析方法和工程设计方法。
3)、够按要求编写课程设计报告书,能正确阐述设计和实验结果便于管理者自由创建公交车的相关信息
2、不足之处:
1)、程序太过繁琐,采用了一些不常用的语句
2)、不能简易地查询任意两站之间的距离
3)、不能查询任意的站点,只能查询起点和终点
4)、不能任意输入两个站点,给出最优的乘车路线
五、自我感受:
课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良
好的基础
在这次课程设计中我遇到许多问题和麻烦,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。
在此对老师和同学们表示感谢!
八、参考文献:
《数据结构实践训练教程》
刘光然
主编
南开大学出版社
《数据结构》
严蔚敏
清华大学出版社
《C语言程序设计》
谭浩强
附录:
#include
structbus
{
charnum[30];//
车号
chardriver[50];//
司机
charstime[30];//
发车时间
charstart[30];//
起始站
charend[30];//
终点站
intz;//站数
char*pr;//指向路线的首指针
structbus*next;//
下一辆车的结构体
};
structbus*bhead=NULL;//放公汽信息的头指针structbus*bi=NULL;//放公汽信息的最后的指针voidinitial()
FILE*fp;
fp=fopen("bus.txt","r");
if(fp==NULL){printf("\n\n无公汽信息文件!
");return;}fseek(fp,0,SEEK_END);
inti,n;
n=ftell(fp)/sizeof(structbus);
//printf("\n\n\n\n—共有%d辆公汽!
",n);
rewind(fp);
structbus*p;
//for
for(i=0;i{p=(structbus*)malloc(sizeof(structbus));fseek(fp,i*sizeof(structbus),0);fread(p,sizeof(structbus),1,fp);//写入信息,其中地址是无用的信息p->next=NULL;//初始化时下一个指向空,都是一个个单独的p->pr=NULL;//让路线为空//路线信息存放在文件名为”车号“的文件中;车号是唯一的FILE*fp1;fp1=fopen(p->num,"r");if(!fp1)printf("\n%s号车无初始路线!",p->num);else{char*p1;p1=(char*)malloc(p->z*40*sizeof(char));fread(p1,p->z*50*sizeof(char),1,fp1);//将路线写入内存p->pr=p1;fclose(fp1);}//printf("\n\n\n\n初始化%s号车路线成功!",p->num);//路线信息if(bhead==NULL)bhead=bi=p;else{bi->next=p;bi=p;}}//for结尾//printf("\n\n\n\n初始化%4辆车成功!",n);fclose(fp);}voidnewb(){loop1:printf("\n\n\n\n■创建新公汽■\n\n");structbus*p;p=(structbus*)malloc(sizeof(structbus));p->next=NULL;p->pr=NULL;loop2:printf("\n请输入新公汽号:\n\n");scanf("%s",p->num);structbus*pj=bhead;while(pj){if(strcmp(pj->num,p->num)==0){printf("\n\n错误,该公汽号已经存在!\n\n");gotoloop2;}pj=pj->next;}printf("\n请输入新公汽司机姓名:\n");scanf("%s",p->driver);printf("\n请输入新路线发车时间\n\n");scanf("%s",p->stime);loop3:printf("\n\n\n请输入新路线总站台数(>=2)\n\n");scanf("%d",&p->z);if(p->z>=2){p->pr=(char*)malloc(p->z*50*sizeof(char));p->pr[0]='\0';inti;charcc[40];for(i=1;i<=p->z;i++){printf("\n请输入公汽第%4站台名称:",i);scanf("%s",cc);if(i==1){strcat(p->pr,cc);strcpy(p->start,cc);}else{strcat(p->pr,">");strcat(p->pr,cc);}}strcpy(p->end,cc);printf("\n\n自动生成公汽路线%s",p->pr);}else{printf("\n\n错误,该公汽站台数小于2,请重新输入!\n\n");gotoIoop3;}if(bhead==NULL)bi=bhead=p;else{bi->next=p;bi=p;}printf("\n\n%s号公汽创建成功!",p->num);printf("\n\n\n您想继续新建(A)退出创建(N)请选择A或N\n\n");charc;c=getch();if(c=='a'||c=='A')gotoloop1;elsereturn;}voidmodifyr(){charc,b[20];printf("\n\n\n\n■修改路线■\n\n");loop:printf("\n请输入要修改路线的公汽号:\n\n");scanf("%s",b);structbus*p=bhead;intn=1;while(p){if(strcmp(p->num,b)==0){printf("\n\n司机姓名:%s",p->driver);n=0;break;}p=p->next;}if(n){printf("\n\n错误,公汽号不存在!\n\n重新修改(A)退出修改(N)请选择A或N\n\n");charc;c=getch();if(c=='a'||c=='A')gotoloop;elsereturn;}loop1:printf("\n\n\n请修改路线总站台数(>=2)\n\n");intnn;scanf("%d",&nn);if(nn>=2){p->pr=(char*)malloc(p->z*50*sizeof(char));p->pr[0]='\0';p->z=nn;inti;charcc[40];for(i=1;i<=p->z;i++){printf("\n请输入公汽第%4站台名称:",i);scanf("%s",cc);if(i==1){strcat(p->pr,cc);strcpy(p->start,cc);}else{strcat(p->pr,">");strcat(p->pr,cc);}}strcpy(p->end,cc);printf("\n\n自动生成修改后的路线%s",p->pr);else{printf("\n\n错误,该公汽站台数小于2,请重新输入!\n\n");gotoloop1;}printf("\n\n\n%s号公汽修改成功!",p->num);printf("\n\n\n您想继续修改(A)退出修改(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;FILE*fp;fp=fopen(p->num,"w");fwrite(p,nn*50*sizeof(char),1,fp);fclose(fp);//保存线路信息}voidmodifyb(){charc,b[20];printf("\n\n\n\n■修改公汽■\n\n");loop:printf("\n请输入要修改路线的公汽号:\n\n");scanf("%s",b);structbus*p=bhead;intn=1;while(p){if(strcmp(p->num,b)==0){printf("\n\n司机姓名:%s发车时间:%sAM",p->driver,p->stime);n=0;break;}p=p->next;}if(n){printf("\n\n错误,公汽号不存在!\n\n重新修改(A)退出修改(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;elsereturn;}printf("\n请输入要修改%s公汽的新司机:\n\n",p->num);scanf("%s",p->driver);printf("\n请输入要修改%s公汽的发车时间:\n\n",p->num);scanf("%s",p->stime);printf("\n\n\n%s号公汽修改成功!",p->num);printf("\n\n\n您想继续修改(A)退出修改(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;}voidshowb(){structbus*p=bhead;if(!p){printf("\n\n公汽线路信息数据库为空!");return;}else{printf("\n\n\n■公汽信息数据库■");printf("\n||");}intn=1;while(p){printf("\n|公汽号:%s站数:%d发车时间:%sAM司机:%s",p->num,p->z,p->stime,p->driver);printf("\n|■路线:%s",p->pr);printf("\n||");n=0;p=p->next;}if(n)printf("\n\n公汽线路信息数据库为空!");}voidlookb(){charc,b[20];//printf("\n\n\n\n■查询路线■\n\n");loop:printf("\n请输入要查询的公汽号:\n\n");scanf("%s",b);structbus*p=bhead;intn=1;while(p){if(strcmp(p->num,b)==0){n=0;break;}p=p->next;}if(n){printf("\n\n错误,公汽号不存在!\n\n重新输入(A)退出查询(N)——请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;elsereturn;}printf("\n||");printf("\n|公汽号:%s站数:%d发车时间:%sAM司机:%s",p->num,p->z,p->stime,p->driver);printf("\n|路线:%s",p->pr);printf("\n||");printf("\n\n\n%s号公汽查询成功!",p->num);printf("\n\n\n您想继续查询(A)退出查询(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;}voidlookr(){//printf("\n\n\n\n■查询公汽■\n\n");charc,b[40];loop://printf("\n[查询公汽菜单]");//printf("\n||");printf("\n\n\n\n请选择查询方式:");printf("\n||");printf("\n|A[起始站查询]|");printf("\n||");printf("\n|B[终点站查询]|");printf("\n||");printf("\n|C[退出]|");printf("\n||");c=getch();if(c=='B'||c=='b'){printf("\n请输入要查询的终点站:\n\n");scanf("%s",b);structbus*p=bhead;intn=1;printf("\n您可以乘坐以下公汽到达%s",p->end);printf("\n|---|");while(p){if(strcmp(p->end,b)==0){n=0;printf("\n|公汽号:%s路线:%s",p->num,p->pr);printf("\n|---|");}p=p->next;}if(n){printf("\n\n错误,终点站不存在!\n\n重新输入(A)退出查询(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;}printf("\n\n您想继续查询(A)退出查询(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;}if(c=='A'||c=='a'){printf("\n请输入要查询的起始站:\n\n");scanf("%s",b);structbus*p=bhead;intn=1;printf("\n您可以乘坐以下公汽起始站为%s",p->start);printf("\n|---|");while(p){if(strcmp(p->start,b)==0){n=0;printf("\n|公汽号:%s路线:%s",p->num,p->pr);printf("\n|---|");}p=p->next;}if(n){printf("\n\n错误,起始站不存在!\n\n重新输入(A)退出查询(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;}printf("\n\n您想继续查询(A)退出查询(N)请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;}}voiddelb(){charb[20];printf("\n\n\n\n■删除公汽■\n\n");loop:printf("\n请输入要删除路线的公汽号:\n\n");scanf("%s",b);structbus*p=bhead;structbus*p1=bhead;intn=1,y=0;while(p){if(strcmp(p->num,b)==0){n=0;break;}y++;if(y>1)p1=p1->next;p=p->next;}charc;if(n){printf("\n\n错误,公汽号不存在!\n\n重新输入(A)退出删除(N)——请选择A或N\n\n");c=getch();if(c=='a'||c=='A')gotoloop;elsereturn;}if(p==bhead)bhead=bhead->next;elsep1->next=p->next;printf("\n删除路线的公汽成功!\n\n");printf("\n\n您是继续删除(A)退出删除(N)——请选择A或N\n\n");
p=(structbus*)malloc(sizeof(structbus));
fseek(fp,i*sizeof(structbus),0);
fread(p,sizeof(structbus),1,fp);//写入信息,其中地址是无用的信息
p->next=NULL;//初始化时下一个指向空,都是一个个单独的
p->pr=NULL;//让路线为空
//路线信息存放在文件名为”车号“的文件中;车号是唯一的
FILE*fp1;
fp1=fopen(p->num,"r");
if(!
fp1)printf("\n%s号车无初始路线!
",p->num);
else{
char*p1;
p1=(char*)malloc(p->z*40*sizeof(char));
fread(p1,p->z*50*sizeof(char),1,fp1);//将路线写入内存
p->pr=p1;
fclose(fp1);
}
//printf("\n\n\n\n初始化%s号车路线成功!
//路线信息
if(bhead==NULL)bhead=bi=p;
else{bi->next=p;bi=p;}
}//for结尾
//printf("\n\n\n\n初始化%4辆车成功!
fclose(fp);
voidnewb()
loop1:
printf("\n\n\n\n■创建新公汽■\n\n");
p=(structbus*)malloc(sizeof(structbus));p->next=NULL;
p->pr=NULL;
loop2:
printf("\n请输入新公汽号:
\n\n");
scanf("%s",p->num);
structbus*pj=bhead;
while(pj)
if(strcmp(pj->num,p->num)==0){printf("\n\n错误,该公汽号已经存在!
gotoloop2;}
pj=pj->next;
printf("\n请输入新公汽司机姓名:
\n");
scanf("%s",p->driver);
printf("\n请输入新路线发车时间\n\n");
scanf("%s",p->stime);
loop3:
printf("\n\n\n请输入新路线总站台数(>=2)\n\n");
scanf("%d",&p->z);
if(p->z>=2)
p->pr=(char*)malloc(p->z*50*sizeof(char));p->pr[0]='\0';
inti;charcc[40];
for(i=1;i<=p->z;i++)
printf("\n请输入公汽第%4站台名称:
",i);
scanf("%s",cc);
if(i==1){strcat(p->pr,cc);strcpy(p->start,cc);}
else{strcat(p->pr,">");strcat(p->pr,cc);}
strcpy(p->end,cc);
printf("\n\n自动生成公汽路线%s",p->pr);
else{printf("\n\n错误,该公汽站台数小于2,请重新输入!
\n\n");gotoIoop3;}
if(bhead==NULL)bi=bhead=p;
printf("\n\n%s号公汽创建成功!
printf("\n\n\n您想继续新建(A)退出创建(N)请选择A或N\n\n");
charc;c=getch();
if(c=='a'||c=='A')gotoloop1;
elsereturn;
voidmodifyr()
charc,b[20];
printf("\n\n\n\n■修改路线■\n\n");
loop:
printf("\n请输入要修改路线的公汽号:
scanf("%s",b);
structbus*p=bhead;
intn=1;
while(p)
if(strcmp(p->num,b)==0){printf("\n\n司机姓名:
%s",p->driver);n=0;break;}p=p->next;
if(n){printf("\n\n错误,公汽号不存在!
\n\n重新修改(A)退出修改(N)
请选择A或N\n\n");
charc;
c=getch();
if(c=='a'||c=='A')gotoloop;
elsereturn;}
printf("\n\n\n请修改路线总站台数(>=2)\n\n");
intnn;
scanf("%d",&nn);
if(nn>=2)
p->pr=(char*)malloc(p->z*50*sizeof(char));p->pr[0]='\0';p->z=nn;
if(i==1){strcat(p->pr,cc);strcpy(p->start,cc);}else{strcat(p->pr,">");strcat(p->pr,cc);}
printf("\n\n自动生成修改后的路线%s",p->pr);
else{printf("\n\n错误,该公汽站台数小于2,请重新输入!
\n\n");gotoloop1;}printf("\n\n\n%s号公汽修改成功!
printf("\n\n\n您想继续修改(A)退出修改(N)请选择A或N\n\n");
fp=fopen(p->num,"w");
fwrite(p,nn*50*sizeof(char),1,fp);
//保存线路信息
voidmodifyb()
printf("\n\n\n\n■修改公汽■\n\n");
\n\n");scanf("%s",b);
%s发车时间:
%s
AM",p->driver,p->stime);n=0;break;}
p=p->next;
请选择A或N\n\n");c=getch();
printf("\n请输入要修改%s公汽的新司机:
\n\n",p->num);
printf("\n请输入要修改%s公汽的发车时间:
printf("\n\n\n%s号公汽修改成功!
voidshowb()
p){printf("\n\n公汽线路信息数据库为空!
");return;}
printf("\n\n\n■公汽信息数据库■");
printf("\n|
|");
printf("\n|公汽号:
%s站数:
%d发车时间:
%sAM司机:
%s",p->num,p->z,
p->stime,p->driver);
printf("\n|■路线:
%s",p->pr);
n=0;
if(n)printf("\n\n公汽线路信息数据库为空!
");
voidlookb()
//printf("\n\n\n\n■查询路线■\n\n");
printf("\n请输入要查询的公汽号:
if(strcmp(p->num,b)==0){n=0;break;}
\n\n重新输入(A)退出查询(N)——
printf("\n|路线:
printf("\n\n\n%s号公汽查询成功!
printf("\n\n\n您想继续查询(A)退出查询(N)请选择A或N\n\n");
voidlookr()
//printf("\n\n\n\n■查询公汽■\n\n");
charc,b[40];
//printf("\n[查询公汽菜单]");
//printf("\n||");
printf("\n\n\n\n请选择查询方式:
printf("\n||");
printf("\n|A[起始站查询]|");
printf("\n|B[终点站查询]|");
printf("\n|C[退出]|");
if(c=='B'||c=='b')
printf("\n请输入要查询的终点站:
printf("\n您可以乘坐以下公汽到达%s",p->end);
---|");
if(strcmp(p->end,b)==0)
%s路线:
%s",p->num,p->pr);
if(n){printf("\n\n错误,终点站不存在!
\n\n重新输入(A)退出查询
(N)请选择A或N\n\n");
printf("\n\n您想继续查询(A)退出查询(N)请选择A或N\n\n");
if(c=='A'||c=='a')
printf("\n请输入要查询的起始站:
intn=1;printf("\n
您可以乘坐以下公汽起始站为%s",p->start);
if(strcmp(p->start,b)==0)
if(n){printf("\n\n错误,起始站不存在!
voiddelb()
charb[20];
printf("\n\n\n\n■删除公汽■\n\n");
printf("\n请输入要删除路线的公汽号:
structbus*p1=bhead;
intn=1,y=0;
y++;
if(y>1)p1=p1->next;
\n\n重新输入(A)退出删除(N)——
elsereturn;}if(p==bhead)bhead=bhead->next;
elsep1->next=p->next;
printf("\n删除路线的公汽成功!
printf("\n\n您是继续删除(A)退出删除(N)——请选择A或N\n\n");
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1