数据结构课设 全国交通系统文档文档格式.docx
- 文档编号:20473026
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:17
- 大小:433.39KB
数据结构课设 全国交通系统文档文档格式.docx
《数据结构课设 全国交通系统文档文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课设 全国交通系统文档文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
[选做内容]
增加旅途中转次数最少的最优决策。
二.设计概要
1)数据类型的定义
本程序运用了关于图这种数据结构。
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={<
v,w>
|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中某个顶点。
删除G中顶点v及相关弧。
InsertArc(&
G,v,w);
图G存在,v和w是G中两个顶点。
在G中增添弧<
,若G是无向的则还增加对称弧<
w,w>
。
DeleteArc(&
在G中删除弧<
,若G是无向的,则还删除对称弧<
w,v>
。
}ADTGraph
其他的抽象数据类型定义如下:
typedefstruct
{
intnumber;
floatexpenditure;
intbegintime[2];
intarrivetime[2];
}Vehide;
//飞机或列车运行信息
Vehidestata[MAX_ROUTE_NUM];
intlast;
//航班次或列车次
}infolist;
//弧的权的信息(车次或航班信息)
typedefstructArcNode
intadjvex;
structArcNode*nextarc;
infolistinfo;
}ArcNode;
//邻接表节点,存入弧(交通路线)的信息
typedefstructVNode
charcityname[10];
ArcNode*planefirstarc,*trainfirstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
//顶点数组元素
AdjListvertices;
intvexnum,planearcnum,trainarcnum;
}ALGraph;
//图结构
typedefstructNode
introute;
structNode*next;
}Node;
//辅助节点的存储结构
typedefstructQNode
structQNode*next;
}QNode;
//队列节点,节点元素为int型
QNode*front;
QNode*rear;
}LinkQueue;
//队列结构
typedefstructTimeNode
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<
G.vexnum;
w++){
查找M数组未被访问的元素中值最少的元素v
If(v==v0){通过存储路径的链式节点数组*p输出完整路线}
Elsev存在,将v置已访问状态,更新M数组,若v0到w的费用通过前驱v会比原来少,就更新,更新辅助链式存储数组P,将w的前驱节点v加入到p[w]中
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到各个节点的直接最少用时(若存在),
查找T数组未被访问的元素中值最少的元素v
Elsev存在,将v置已访问状态,更新辅助链式存储数组P,将w的前驱节点v加入到p[w]中,借助辅助时间树更新T数组,若v0到w的用时通过前驱v会比原来少,就更新,
2)函数和过程的调用关系图
四.调试分析
1)调试过程中遇到的问题的解决的以及对设计与实现的回顾讨论和分析
a.文件操作中遇到读入错误或找不到文件;
解决:
通过参考谭浩强编著的《C程序设计》中的文件操作,文件写入和读取的格式和相关文件路径的设置,最终解决问题
b.获取键盘输入报错
通过调试发现是因为粗心大意在用scanf函数是少打取地址符&
c.形参使用不当
查看教科书和上午查找相关的用法说明,最终解决问题
2)算法的时空分析
基本操作
时间复杂度
空间复杂度
voidLogIn(ALGraph*G)
O
(1)
voidAdminister(ALGraph*G)
voidcityedit(ALGraph*G)
O(n)
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,int
v0,intv1,int(*T)[2],int*final)
voidTimeTreeDispose(Node*head,infolist
(*arcs)[MAX_VERTEX_NUM])
voidtrainedit(ALGraph*G)
voidTransferDispose(intk,infolist
v0,intv1)
voidUserDemand(ALGraphG)
voidVisitTimeTree(TimeTreep)
3)经验和体会
这次编程我很深的体会就是要有耐心,编写程序本身是一件对大多数人来说很枯燥的事情,想想完成程序后的成就感对我来说是个不错的方法。
再有一点就是要细心,程序这种东西很矫情,融不舍得一点的差错,也许错一个小小的字母就会上我们的程序崩盘,所以我们要做到细心细心再细心,因为编译软件再厉害,还有他们找不到的错误。
还有通过本次课程设计,我学到了一种程序设计方法,就是结构化程序设计方法,在程序设计过程中,我尝试按如下方法进行结构化程序设计:
(1)自顶向下;
(2)逐步细化;
(3)模块化设计(4)结构化编码。
这种设计方法的过程是将问题求解由抽象逐步具体化的过程,而且,用这种方法便于验证算法的正确性。
五.用户使用说明
1)打开并运行程序,按任意键进入操作主界面,按提示进行相关操作;
2)按“1”进入管理员登录界面,登录成功后可进入交通系统操作界面,按“2”进入用户咨询界面,按“3”显示交通系统,按“4”则退出。
3)进入管理员界面可键入“1”初始化交通系统,并选择文档初始化方式(如果是第一次使用该系统建议使用文档初始化交通系统,免得自己进行繁冗的初
始化操作)。
4)进入用户咨询界面,可根据用户需要进行相关的选择,或是选择“1”(最少
旅行费用);
或是选择“2”(最少旅行时间),又或者是选择“3”(最少旅行中转次数)等。
5)进入显示交通系统界面,根据用户选择则可显示城市、飞机航班、列车车次
等信息。
或者返回上一级菜单。
六.测试结果
①开始界面
②功能界面
③登录界面
④管理项目界面
⑤用户咨询界面
⑥显示交通系统界面
七.附录
源代码文件名:
main.cpp
存储数据的文件名:
city.txtplane.txttrain.txt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课设 全国交通系统文档 数据结构 全国 交通 系统 文档