资源描述
《数 据 结 构》课 程 设 计 报 告
一、课程设计名称
公交线路管理模拟系统
二、实用工具软件
Microsoft visual C++ 6.0
三、课程设计内容简介
1、 实践目的
1)、掌握图的概念、图的两种存储结构(邻接矩阵和邻接表)的存储思想及其存储实现;
2)、掌握上机实现图的基本方法;
3)、掌握有关图的操作并用高级语言编程实现;
4)、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;
5)、掌握图的常见应用算法的思想及其程序实现。
2、 实践要求
1)、掌握本章实践的算法;
2)、上机运行本章的程序,保存和打印出程序的运行结果,并结合程序进行分析;
3)、按照你对图的操作需要,重新改写程序并运行,打印出文件清单和运行结果;
4)、注意理解各算法实现时所采用的存储结构;
5)、注意正、逆邻接表。
3、 系统简介及设计思路
本项目是对公交车路线信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。
本项目的实质是完成对公交路线信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据之间都可能相关。所以可以用图形结构来表示n个公交站点之间及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一点开始的第一个邻接点和下一个邻接点。因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。
4、 程序设计流程
为了创建公交路线,首先建立结构体载入公交车的相关信息:名称、司机、起始站、终点站、站数以及距离。利用邻接表把站点与站点之间的信息储存起来。用文件详细记载了路线信息,便于管理者初始化公交路线信息。再构造子函数来创建、及时修改、插入、删除公交信息、以及查询公交路线是否出错,各站点之间的距离。用主函数来调用子函数,进入导航系统而进行操作。
主函数(main)流程
导航查询(initial)流程
汽车查询(包含车号、站台查询)流程
新建(newb)流程
修改路线(Modifyr)流程
修改汽车(modifyb)流程
删除汽车(delb)流程
5、运行环境
代码用C语言完成,布置在Microsoft visual C++ 6.0运行。Microsoft visual C++ 6.0具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。
输入如下公交线路信息
12
1
14
13
6
2
7
3
4
10
17
16
15
5
8
9
1路 津A10001 司机1 6:00 1—>2—>3—>4—>5
2路 津A10002 司机2 6:15 6—>7—>4—>8—>17—>12
3路 津A10003 司机3 6:00 9—>7—>3—>10—>12
4路 津A10004 司机4 6:30 6—>13—>1—>12—>14—>17
5路 津A10005 司机5 7:00 15—>5—>8—>16—>10—>2—>13
创建示意图(1路)
创建结束选择N回到主菜单,再选择A(导航查询)
主菜单下选择B(公汽查询)就可以查询已有的公交信息,查询方式有公汽号查询、站台查询两种查询方式
我们以公汽号查询(查询 津A10001)为例:
返回到主菜单,选择D进入系统管理
我们以修改路线为例(修改 津A10001)
最后在主菜单下选择E(清空数据)
最后选择F即可退出程序。
四、 得意与不足之处:
1、得意之处:
1)、可以根据题目需要翻阅图书馆资料自学C++程序,完成代码。
2)、完成过程中思路清晰,可以根据实际进行分析设计、编程调试,能够熟练应用软件的分析方法和工程设计方法。
3)、够按要求编写课程设计报告书,能正确阐述设计和实验结果便于管理者自由创建公交车的相关信息
2、 不足之处:
1)、程序太过繁琐,采用了一些不常用的语句
2)、不能简易地查询任意两站之间的距离
3)、不能查询任意的站点,只能查询起点和终点
4)、不能任意输入两个站点,给出最优的乘车路线
五、 自我感受:
课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。
在这次课程设计中我遇到许多问题和麻烦,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。在此对老师和同学们表示感谢!
八、参考文献:
《数据结构实践训练教程》 刘光然 主编 南开大学出版社
《数据结构》 严蔚敏 主编 清华大学出版社
《C语言程序设计》 谭浩强 主编 清华大学出版社
附录:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct bus
{
char num[30];//车号
char driver[50];//司机
char stime[30];//发车时间
char start[30];//起始站
char end[30];//终点站
int z;//站数
char *pr;//指向路线的首指针
struct bus *next;//下一辆车的结构体
};
struct bus *bhead=NULL;//放公汽信息的头指针
struct bus *bi=NULL;//放公汽信息的最后的指针
void initial()
{
FILE *fp;
fp=fopen("bus.txt","r");
if(fp==NULL){printf("\n\n无公汽信息文件!");return;}
fseek(fp,0,SEEK_END);
int i,n;
n=ftell(fp)/sizeof(struct bus);
//printf("\n\n\n\n一共有%d辆公汽!",n);
rewind(fp);
struct bus *p;
//for
for(i=0;i<n;i++)
{
p=(struct bus *)malloc(sizeof(struct bus ));
fseek(fp,i*sizeof(struct bus),0);
fread(p,sizeof(struct bus),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初始化%d辆车成功!",n);
fclose(fp);
}
void newb()
{
loop1:
printf("\n\n\n\n█创建新公汽█\n\n");
struct bus *p;
p=(struct bus *)malloc(sizeof(struct bus ));
p->next=NULL;
p->pr=NULL;
loop2:
printf("\n请输入新公汽号:\n\n");
scanf("%s",p->num);
struct bus *pj=bhead;
while(pj)
{
if(strcmp(pj->num,p->num)==0){printf("\n\n错误,该公汽号已经存在!\n\n"); goto loop2;}
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';
int i;char cc[40];
for(i=1;i<=p->z;i++)
{
printf("\n请输入公汽第%d站台名称:",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"); goto loop3;}
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 ");
char c;c=getch();
if(c=='a'||c=='A') goto loop1;
else return;
}
void modifyr()
{
char c,b[20];
printf("\n\n\n\n █修改路线█\n\n");
loop:
printf("\n请输入要修改路线的公汽号:\n\n");
scanf("%s",b);
struct bus *p=bhead;
int n=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 ");
char c;
c=getch();
if(c=='a'||c=='A') goto loop;
else return;}
loop1:
printf("\n\n\n请修改路线总站台数(>=2)\n\n");
int nn;
scanf("%d",&nn);
if(nn>=2)
{
p->pr=(char *)malloc( p->z*50*sizeof(char) );
p->pr[0]='\0'; p->z=nn;
int i;char cc[40];
for(i=1;i<=p->z;i++)
{
printf("\n请输入公汽第%d站台名称:",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"); goto loop1;}
printf("\n\n\n%s号公汽修改成功!",p->num);
printf("\n\n\n您想 继续修改(A) 退出修改(N)-------请选择 A 或 N \n\n ");
c=getch();
if(c=='a'||c=='A') goto loop;
FILE *fp;
fp=fopen(p->num,"w");
fwrite(p,nn*50*sizeof(char),1,fp);
fclose(fp);
//保存线路信息
}
void modifyb()
{
char c,b[20];
printf("\n\n\n\n █修改公汽█\n\n");
loop:
printf("\n请输入要修改路线的公汽号:\n\n");
scanf("%s",b);
struct bus *p=bhead;
int n=1;
while(p)
{
if(strcmp(p->num,b)==0){printf("\n\n司机姓名: %s 发车时间: %s AM",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') goto loop;
else return;}
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') goto loop;
}
void showb()
{
struct bus *p=bhead;
if(!p){printf("\n\n公汽线路信息数据库为空!"); return; }
else{
printf("\n\n\n █公汽信息数据库█ ");
printf("\n|-------------------------------------------------------------------------|");
}
int n=1;
while(p)
{
printf("\n| 公汽号:%s 站数:%d 发车时间:%s AM 司机:%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公汽线路信息数据库为空!");
}
void lookb()
{
char c,b[20];
//printf("\n\n\n\n █查询路线█\n\n");
loop:
printf("\n请输入要查询的公汽号:\n\n");
scanf("%s",b);
struct bus *p=bhead;
int n=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') goto loop;
else return;}
printf("\n|-------------------------------------------------------------------------|");
printf("\n| 公汽号:%s 站数:%d 发车时间:%s AM 司机:%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') goto loop;
}
void lookr()
{
// printf("\n\n\n\n █查询公汽█\n\n");
char c,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);
struct bus *p=bhead;
int n=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') goto loop;
}
printf("\n\n您想 继续查询(A) 退出查询(N)-------请选择 A 或 N \n\n ");
c=getch();
if(c=='a'||c=='A') goto loop;
}
if(c=='A'||c=='a')
{
printf("\n请输入要查询的起始站:\n\n");
scanf("%s",b);
struct bus *p=bhead;
int n=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') goto loop;
}
printf("\n\n您想 继续查询(A) 退出查询(N)-------请选择 A 或 N \n\n ");
c=getch();
if(c=='a'||c=='A') goto loop;
}
}
void delb()
{
char b[20];
printf("\n\n\n\n █删除公汽█\n\n");
loop:
printf("\n请输入要删除路线的公汽号:\n\n");
scanf("%s",b);
struct bus *p=bhead;
struct bus *p1=bhead;
int n=1,y=0;
while(p)
{
if(strcmp(p->num,b)==0){n=0;break;}
y++;
if(y>1) p1=p1->next;
p=p->next;
}
char c;
if(n){ printf("\n\n错误,公汽号不存在!\n\n重新输入(A) 退出删除(N)-------请选择 A 或 N \n\n ");
c=getch();
if(c=='a'||c=='A') goto loop;
else return;}
if(p==bhead)bhead=bhead->next;
else p1->next=p->next;
printf("\n删除路线的公汽成功!\n\n");
printf("\n\n您是 继续删除(A) 退出删除(N)-------请选择 A 或 N \n\n ");
c=getch();
if(c=='a'||c=='A') goto loop;
}
void save()
{
FILE *fp;
fp=fopen("bus.txt","w");
struct bus *p;
p=bhead;
int n=0;
while(p)
{//第一个while
fseek(fp,n*sizeof(struct bus),0);
fwrite(p,sizeof(struct bus ),1,fp);
n++;
FILE *fp1;
fp1=fopen(p->num,"w");
fwrite(p->pr,p->z*50*sizeof(char),1,fp1);
fclose(fp1);
p=p->next;
}
fclose(fp);
//printf("\n\n\n\n保存%d辆车成功!",n);
}
void release()
{
bhead=bi=NULL;
printf("\n\n\n数据清空成功!");
}
void show1()
{
printf("\n\n\n\n\n |----------------------------------------|");
printf("\n | █主 菜 单 █ |");
printf("\n |----------------------------------------|");
printf("\n | A 导 航 查 询 |");
printf("\n |----------------------------------------|");
printf("\n | B 公 汽 查 询 |");
printf("\n |----------------------------------------|");
printf("\n | C 新 建 公 汽 |");
printf("\n |----------------------------------------|");
printf("\n | D 系 统 管 理 |");
printf("\n |----------------------------------------|");
printf("\n | E 清 空 数 据 |");
printf("\n |----------------------------------------|");
printf("\n | F 退 出 程 序 |");
printf("\n |----------------------------------------|");
printf("\n | 请您选择一个任务 |");
printf("\n |----------------------------------------|\n\n\n");
}
void show2()
{
printf("\n |-----------------------------|");
printf("\n | █管 理 菜 单█ |");
printf("\n |-----------------------------|");
printf("\n | A 修 改 路 线 |");
printf("\n |-----------------------------|");
printf("\n | B 修 改 公 汽 |");
printf("\n |-----------------------------|");
printf("\n | C 删 除 公 汽 |");
printf("\n |-----------------------------|");
printf("\n | D 退 出 程 序 |");
printf("\n |-----------------------------|");
printf("\n | 请您选择一个任务 |");
printf("\n |-----------------------------|\n\n\n");
}
void show3()
{
printf("\n\n █查 询 菜 单█");
printf("\n|-----------------------------------|");
printf("\n| 请选择查询方式: |");
printf("\n|-----------------------------------|");
printf("\n| A[ 公汽号 查询 ] |");
printf("\n|-----------------------------------|");
printf("\n| B[ 站 台 查 询 ] |");
printf("\n|-----------------------------------|");
printf("\n| C[ 退 出 ] |");
printf("\n|-----------------------------------|");
}
void main()
{
printf("\n\n ★ 欢迎使用公汽查询系统!★");
initial();
char c1;
do {
show1();
c1=getch();
switch ( c1 )
{
case 'a':
case 'A':showb();break;
case 'b':
case 'B': {
char c3;
do{
show3();
c3=getch();
switch ( c3)
{
case 'a':
case 'A':lookb();break;
case 'b':
case 'B':lookr();break;
case 'c':
case 'C':break;
}
}while(c3!='c'&&c3!='C');
}break;
case 'c':
case 'C':newb();break;
case 'd':
case 'D':
{
char c2;
do{
show2();
c2=getch();
switch ( c2)
{
case 'a':
case 'A':modifyr();break;
case 'b':
case 'B':modifyb();break;
case 'c':
case 'C':delb();break;
}
}while(c2!='d'&&c2!='D');
}break;
case 'E':
case 'e':release(); save(); break;
}
}while(c1!='f'&&c1!='F');
save();
printf("\n\n
展开阅读全文