数据结构课程设计报告
一、需求分析 1.问题描述2.基本要求二、概要设计
题目:全国铁路运输网最佳经由问题
目 录
1. 程序流程图 2. 数据结构设计 三、详细设计 1.程序设计思想 2.软件模块结构图 3.源程序 四、调试分析 1.测试数据 2.时间复杂度分析
3.上机遇到的问题及解决方案 4.算法的改进设想 五、用户使用手册 六、心得体会
一、需求分析 1.问题描述
该题目采用我国铁路运输网的数据进行编程和运行验证。详细可在网上搜索《全国铁路局管辖线路示意图》,只要全国的主干线就可以了。
铁路运输网络中由铁路线和火车站的两个主要概念,譬如:1号铁路线表示京广线,2号铁路线表示京沪线等。
铁路线对象包括铁路线编号,铁路线名称,起始站编号,终点站编号,该铁路线
长度,通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B客货运通行)。
火车站对象包括所属铁路线编号,车站代码,车站名,车站简称,离该铁路线起点站路程及终点站路程。 2.基本要求
(1)查询某站所属的铁路线
(2)要求具备新增铁路线的管理功能 (3)要求具备新增车站的管理功能
(4)针对客运,货运情况能计算任何一个起始车站到任何一个终点站之间的最短路径。并且要求能够显示出该最短路径的各个火车站的经由顺序 二、概要设计
1. 程序流程图(我负责的为除弗洛伊德算法外的设计)
开 始 main readviews(); readways(); readlines(); switch(menu) menu=1 menu=2 addview(); addline(); addway(); menu=5 menu=3 menu=4 short_path(); floyed(); search(); 输出谢谢使用.再见.谢梦芳 李婷婷 结束
在这里简单介绍弗洛伊德算法的核心思想:从图的带权邻接矩阵开始,假设从Vi到Vj有弧,则从Vi到Vj存在一条长度为arcs[i] [j]的路径,该路径不一定是最小路径,尚需进行n次试探。首先考虑路径(Vi,V0,Vj)是否存在。如果存在,则比较(Vi,Vj)和(Vi,V0,Vj)的路径长度取长度较短者为从Vi到Vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点V1,如果(Vi,?.,V1)和(V1,?.,Vj)分别是当前找到的中间顶点的序号不大于0的最短路径,那么(Vi,?V1,?,Vj)就有可能是从Vi到Vj的中间顶点的序号不大于1的最短路径。将它和已经得到的Vi到Vj的中间顶点的序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个V2继续试探,以此类推,经过n次比较后,即可求出从Vi到Vj的最短路径。
2.数据结构设计
存储结构:本程序部分函数采用的是文件进行数据的存储,所以采用的是顺序存储结构,如要添加数据,直接在文件里面进行操作就行了。弗洛伊德算法中采用的存储结构是图的邻接矩阵。
A.如下为抽象数据类型定义的模板以及抽象数据类型线性表的定义: ADT List{
数据对象:D={ai| ai ∈ElemSet,i=1,2,3??,n,n≥0} 数据关系:R1={| ai-1,ai ∈D,i=1,2,3,??,n} 基本操作: void readviews()
初始条件:views.txt已经存在。
操作结果:将 views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count; void readways()
初始条件:ways.txt已经存在。
操作结果:将 ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count; void readlines()
初始条件:lines.txt已经存在。
操作结果:将 lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count; void search();
初始条件:views[SIZE_view]存在,且里面放有相关信息。 操作结果:根据用户输入的车站名查找该车站的相关信息并输出; void addview()
初始条件:views.txt已经存在。
操作结果:将 views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;