数据结构课设 全国交通系统文档.docx
《数据结构课设 全国交通系统文档.docx》由会员分享,可在线阅读,更多相关《数据结构课设 全国交通系统文档.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课设全国交通系统文档
数据结构课设
课程名称数据结构课设
题目名称全国交通系统
学生学院计算机
专业班级
学号
学生姓名
指导教师蒋
2016年11月28日
一.需求分析
1)程序任务要求
[问题描述]
出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
[基本要求]
①提供对城市信息进行编辑(如:
添加或删除)的功能。
②城市之间有两种交通工具:
火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
③提供两种最优决策:
最快到达或最省钱到达。
全程只考虑一种交通工具。
④旅途中耗费的总时间应该包括中转站的等候时间。
⑤咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息为:
最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
[选做内容]
增加旅途中转次数最少的最优决策。
二.设计概要
1)数据类型的定义
本程序运用了关于图这种数据结构。
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={|v,w∈V且P(v,w),表示从v到w的弧。
谓词P(v,w)定义了弧的意义或信息}
基本操作P:
CreateGraph(&G,V,VR);
初始条件:
V是图的顶点集,VR是图中弧的集合。
操作结果:
按V和VR的定义构造图G。
LocateVet(G,u);
初始条件:
图G存在,u和G中顶点有相同的特征。
操作结果:
若G中存在顶点u,则返回该顶点在图中的位置,
否则返回其他信息。
InsertVex(&G,v);
初始条件:
图G存在,v和图中顶点有相同特征。
操作结果:
在图G中添加新顶点v。
DeleteVex(&G,v);
初始条件:
图G存在,v是G中某个顶点。
操作结果:
删除G中顶点v及相关弧。
InsertArc(&G,v,w);
初始条件:
图G存在,v和w是G中两个顶点。
操作结果:
在G中增添弧,若G是无向的则还增加对称弧。
DeleteArc(&G,v,w);
初始条件:
图G存在,v和w是G中两个顶点。
操作结果:
在G中删除弧,若G是无向的,则还删除对称弧。
}ADTGraph
其他的抽象数据类型定义如下:
typedefstruct
{
intnumber;
floatexpenditure;
intbegintime[2];
intarrivetime[2];
}Vehide;//飞机或列车运行信息
typedefstruct
{
Vehidestata[MAX_ROUTE_NUM];
intlast;//航班次或列车次
}infolist;//弧的权的信息(车次或航班信息)
typedefstructArcNode
{
intadjvex;
structArcNode*nextarc;
infolistinfo;
}ArcNode;//邻接表节点,存入弧(交通路线)的信息
typedefstructVNode
{
charcityname[10];
ArcNode*planefirstarc,*trainfirstarc;
}VNode,AdjList[MAX_VERTEX_NUM];//顶点数组元素
typedefstruct
{
AdjListvertices;
intvexnum,planearcnum,trainarcnum;
}ALGraph;//图结构
typedefstructNode
{
intadjvex;
introute;
structNode*next;
}Node;//辅助节点的存储结构
typedefstructQNode
{
intadjvex;
structQNode*next;
}QNode;//队列节点,节点元素为int型
typedefstruct
{
QNode*front;
QNode*rear;
}LinkQueue;//队列结构
typedefstructTimeNode
{
intadjvex;
introute;
intbegintime[2];
intarrivetime[2];
structTimeNode*child[MAX_ROUTE_NUM];
}TimeNode,*TimeTree;//求最短时间辅助树
structarc
{
intco;//列车或飞机编号
charvt[10];//起始城市
charvh[10];//到达城市
intbt[2];//起始时间
intat[2];//到达时间
floatmo;//费用
}a[MAX_ARC_SIZE];//存放边信息
2)操作函数
voidAdminister(ALGraph*G);/*管理员操作*/
voidcityedit(ALGraph*G);/*编辑城市节点*/
voidCopyTimeTree(TimeTreep,TimeTreeq);/*复制辅助树*/
voidcreatecityfile();/*创建城市文档*/
voidCreateGraph(ALGraph*G);/*创建图*/
voidcreateplanefile();/*创建航线文档*/
voidCreateTimeTree(TimeTreep,inti,intj,LinkQueue*Q,infolist
(*arcs)[MAX_VERTEX_NUM]);
voidcreatetrainfile();/*创建列车路线文档*/
intDeleteplaneArc(ALGraph*G);
voidDeleteQueue(LinkQueue*Q,int*x);
intDeletetrainArc(ALGraph*G);
voidDeleteVertex(ALGraph*G);
voidDemandDispose(intn,ALGraphG);/*处理用户请求*/
voidDestoryTimeTree(TimeTreep);
voidEnterplaneArc(ALGraph*G);
voidEnterQueue(LinkQueue*Q,intx);
voidEntertrainArc(ALGraph*G);
voidEnterVertex(ALGraph*G);
voidExpenditureDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,float*M,int*final);/*求取费用最少路线*/
voidflightedit(ALGraph*G);
voidinitgraph(ALGraph*G);/*初始化交通系统*/
voidInitQueue(LinkQueue*Q);
intIsEmpty(LinkQueue*Q);
intLocateVertex(ALGraph*G,char*v);
voidMinExpenditure(infolistarcs,float*expenditure,int*route);
voidMinTime(infolistarcs,int*time,int*route);
voidPrintGraph(ALGraph*G);
intsave(ALGraph*G);
voidTimeDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,int(*T)[2],int*final);/*求取用时最少的路线*/
voidTimeTreeDispose(Node*head,infolist(*arcs)[MAX_VERTEX_NUM]);
voidtrainedit(ALGraph*G);
voidTransferDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1);/*求取中转最少路线*/
voidUserDemand(ALGraphG);
voidVisitTimeTree(TimeTreep);
voidLogIn(ALGraph*G);/*登录管理员界面*/
3)主程序的流程以及各程序模块之间的调用关系
三.详细设计
1)伪码算法
intmain()
{
界面初始化;
输入操作命令;
While(“命令”!
=“退出”)
{
接受命令(用户输入要实现功能);
进入各个处理命令函数;
}
}
voidTransferDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1){//求中转站最少路径
该函数要用到存储路径的链式节点数组*p和辅助队列;
V0入队
While(队列不为空){
If(v0的下一个连接顶点w未被访问){
将v0,w按顺序存到链式数组元素p[w]中
If(w==v1)输出路径信息
W入队
}
下一个连接顶点(t=t->nextarc;)
}
不存在v0到v1的路线
}
voidExpenditureDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,float*M,int*final){
//求费用最少的路线
该函数要用到存储路径的链式节点数组*p和floatM[],M[V]表示从起始城市V0到V的最少费用,标志数组final[],final[i]=1表示V0到i已求得用费最少的路线,再通过i求其他最短路线,直到求到目的城市V1,这类似普利姆算法。
首先是初始化M[],final[],p[],先求得v0到各个节点的直接最少费用(若存在),
for(w=0;w查找M数组未被访问的元素中值最少的元素v
If(v==v0){通过存储路径的链式节点数组*p输出完整路线}
Elsev存在,将v置已访问状态,更新M数组,若v0到w的费用通过前驱v会比原来少,就更新,更新辅助链式存储数组P,将w的前驱节点v加入到p[w]中
}
不存在v0到v1的路线
}
voidTimeDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,int(*T)[2],int*final){
//求用时最少的路线
该函数要用到存储路径的链式节点数组*p和T[][],T[V]表示从起始城市V0到V的最少用时,标志数组final[],final[i]=1表示V0到i已求得用时最少的路线,再通过i求其他用时最短路线,直到求到目的城市V1,这类似普利姆算法。
首先是初始化M[],final[],p[],先求得v0到各个节点的直接最少用时(若存在),
for(w=0;w查找T数组未被访问的元素中值最少的元素v
If(v==v0){通过存储路径的链式节点数组*p输出完整路线}
Elsev存在,将v置已访问状态,更新辅助链式存储数组P,将w的前驱节点v加入到p[w]中,借助辅助时间树更新T数组,若v0到w的用时通过前驱v会比原来少,就更新,
}
不存在v0到v1的路线
}
}
2)函数和过程的调用关系图
四.调试分析
1)调试过程中遇到的问题的解决的以及对设计与实现的回顾讨论和分析
a.文件操作中遇到读入错误或找不到文件;
解决:
通过参考谭浩强编著的《C程序设计》中的文件操作,文件写入和读取的格式和相关文件路径的设置,最终解决问题
b.获取键盘输入报错
解决:
通过调试发现是因为粗心大意在用scanf函数是少打取地址符&
c.形参使用不当
解决:
查看教科书和上午查找相关的用法说明,最终解决问题
2)算法的时空分析
基本操作
时间复杂度
空间复杂度
voidLogIn(ALGraph*G)
O
(1)
O
(1)
voidAdminister(ALGraph*G)
O
(1)
O
(1)
voidcityedit(ALGraph*G)
O(n)
O(n)
voidCopyTimeTree(TimeTreep,TimeTreeq)
O(n)
O
(1)
voidcreatecityfile()
O(n)
O(n)
voidCreateGraph(ALGraph*G)
O(n)
O(n)
voidcreateplanefile()
O
(1)
O
(1)
voidCreateTimeTree(TimeTreep,inti,intj,LinkQueue*Q,infolist(*arcs)[MAX_VERTEX_NUM])
O(n)
O(n)
voidcreatetrainfile()
O
(1)
O
(1)
intDeleteplaneArc(ALGraph*G)
O(n)
O(n)
voidDeleteQueue(LinkQueue*Q,int*x)
O
(1)
O
(1)
intDeletetrainArc(ALGraph*G)
O(n)
O(n)
voidDeleteVertex(ALGraph*G)
O(n)
O(n)
voidDemandDispose(intn,ALGraphG)
O
(1)
O
(1)
voidDestoryTimeTree(TimeTreep)
O(n)
O
(1)
voidEnterplaneArc(ALGraph*G)
O(n)
O(n)
voidEnterQueue(LinkQueue*Q,intx)
O
(1)
O
(1)
voidEntertrainArc(ALGraph*G)
O
(1)
O
(1)
voidEnterVertex(ALGraph*G)
O(n)
O(n)
voidExpenditureDispose(intk,infolist(*arcs)
[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,float*M,int*final)
O(n)
O
(1)
voidflightedit(ALGraph*G)
O
(1)
O
(1)
voidinitgraph(ALGraph*G)
O
(1)
O(n)
voidInitQueue(LinkQueue*Q)
O
(1)
O
(1)
intIsEmpty(LinkQueue*Q)
O
(1)
O
(1)
intLocateVertex(ALGraph*G,char*v)
O(n)
O
(1)
voidMinExpenditure(infolistarcs,float
*expenditure,int*route)
O(n)
O(n)
voidMinTime(infolistarcs,int*time,int*route)
O(n)
O(n)
voidPrintGraph(ALGraph*G)
O
(1)
O(n)
intsave(ALGraph*G)
O
(1)
O
(1)
voidTimeDispose(intk,infolist
(*arcs)[MAX_VERTEX_NUM],ALGraphG,int
v0,intv1,int(*T)[2],int*final)
O(n)
O(n)
voidTimeTreeDispose(Node*head,infolist
(*arcs)[MAX_VERTEX_NUM])
O(n)
O(n)
voidtrainedit(ALGraph*G)
O
(1)
O
(1)
voidTransferDispose(intk,infolist
(*arcs)[MAX_VERTEX_NUM],ALGraphG,int
v0,intv1)
O(n)
O(n)
voidUserDemand(ALGraphG)
O
(1)
O
(1)
voidVisitTimeTree(TimeTreep)
O(n)
O(n)
3)经验和体会
这次编程我很深的体会就是要有耐心,编写程序本身是一件对大多数人来说很枯燥的事情,想想完成程序后的成就感对我来说是个不错的方法。
再有一点就是要细心,程序这种东西很矫情,融不舍得一点的差错,也许错一个小小的字母就会上我们的程序崩盘,所以我们要做到细心细心再细心,因为编译软件再厉害,还有他们找不到的错误。
还有通过本次课程设计,我学到了一种程序设计方法,就是结构化程序设计方法,在程序设计过程中,我尝试按如下方法进行结构化程序设计:
(1)自顶向下;
(2)逐步细化;(3)模块化设计(4)结构化编码。
这种设计方法的过程是将问题求解由抽象逐步具体化的过程,而且,用这种方法便于验证算法的正确性。
五.用户使用说明
1)打开并运行程序,按任意键进入操作主界面,按提示进行相关操作;
2)按“1”进入管理员登录界面,登录成功后可进入交通系统操作界面,按“2”进入用户咨询界面,按“3”显示交通系统,按“4”则退出。
3)进入管理员界面可键入“1”初始化交通系统,并选择文档初始化方式(如果是第一次使用该系统建议使用文档初始化交通系统,免得自己进行繁冗的初
始化操作)。
4)进入用户咨询界面,可根据用户需要进行相关的选择,或是选择“1”(最少
旅行费用);或是选择“2”(最少旅行时间),又或者是选择“3”(最少旅行中转次数)等。
5)进入显示交通系统界面,根据用户选择则可显示城市、飞机航班、列车车次
等信息。
或者返回上一级菜单。
六.测试结果
①开始界面
②功能界面
③登录界面
④管理项目界面
⑤用户咨询界面
⑥显示交通系统界面
七.附录
源代码文件名:
main.cpp
存储数据的文件名:
city.txtplane.txttrain.txt