1、数据结构课程设计报告公交换乘课 程 设 计 报 告题目: 武昌地区公交查询与换乘推荐 课程名称: 数据结构课程设计 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院任 务 书 设计内容掌握图、查找、排序等数据结构的物理存储结构与基本算法,通过解决较复杂的基于图模型的实际问题,提高学生对数据结构知识综合运用的技能与实践能力。 设计要求(1)从互联网或相关资料获取可靠的武汉公交线路及其地理数据,通过线性结构与图模型对其进行表示,且以文件保存。(2)图形方式显示上述图模型与求解结果。(3)界面友好,实现的功能包括:录入与修改公交线路信息;查询所有线路信息(线路名号、起点、
2、终点、首末车时间、票价规则),按线路名或起点站名排序;查询指定线路的详情(沿途站点、首末车时间、票价规则、站间距离等);查询某一位置途经的所有公交线路、指定起点与终点,推荐乘车方案(如要求换乘次数最少、路线最短或无要求条件等)。 参考文献1 严蔚敏, 吴伟民. 数据结构(C语言版). 北京: 清华大学出版社,19972 严蔚敏, 吴伟民, 米宁. 数据结构题集(C语言版). 北京: 清华大学出版社,19993 博客园,华山大师兄的博客,最短路径Dijkstra算法和Floyd算法 1 引言1.1 课题背景与意义1.1.1 公交出行 公交出行是现在城市生活中必不可少的一种出行方式。但往往由于线路
3、四通八达,车次繁多,乘客众多,乘公交成了一件麻烦事。公交查询与换乘推荐系统正是为了解决乘公交的诸多不便而产生的。1.1.2 图模型图类型是一种重要的数据结构,而公交换查询与换乘推荐系统是图模型的典型应用。在此系统中,将会模拟图中遍历,查找,最短路径搜索等重要操作,巩固图模型的各种操作。 1.2 国内外研究现状 如今,公交出行方式已经较为成熟。随着互联网时代的到来,各种查询系统也是一应俱全。例如武汉市公交查询网站:、上均有非常方便的查询服务提供。国内外情况均是如此。1.3 课程设计的主要研究工作主要内容:首先要搜集武汉数武昌区公交线路站点信息。(*由于十分复杂,使用完整的线路站点信息会导致数据料
4、过于庞大且没有必要,故采用在武汉市地铁交通图上选取一些具有代表性的线路的站点信息代替。)其然后是进行系统总体设计如下:1.线路信息查询:线路信息查询中要将所有线路的票价、首班时间、末班时间、途径所有站点等信息显示出来。故需要根据已经初始化好的线路信息打印在屏幕上,按照邻接列表的存储顺序遍历图,一次打印途经站点的名字。2.站点信息查询: 站点信息查询中,为了方便输入,提高效率,故先对所有站点编号显示在屏幕上供使用者查阅,根据编号输入需要查询的站点。对每一个站点需要了解所在的所有线路,并分别显示该站点在该线路上的上一站和下一站,以及该线路的起点和终点。如果该站点为起点或终点,则另作提示。3.距离最
5、短路线查询: 使用者对照站点名字与编号输入起点编号与终点编号,则通过程序得出两点间的最短距离以及沿途站点,并给出线路推荐。当两站间有多条线路可以选择时,则给出提示。 该部分使用迪杰特拉斯最短路线算法,使用邻接矩阵的存储结构进行搜索。Dijkstra算法说明如下:1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合 V 分成两组,第一组为已求出最短路径的顶点集合(用 S 表示,初始时 S 中只有一个源点,以后每求得一条最短路径,就将加入到集合 S 中,直到全部顶点都加入到 S 中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用 U 表示),按最短路径长度的递增次序依次把第二组
6、的顶点加入 S 中。在加入的过程中,总保持从源点 start 到 S 中各顶点的最短路径长度不大于从源点 start 到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从 start 到此顶点的最短路径长度,U 中的顶点的距离,是从 start 到此顶点只包括 S 中的顶点为中间顶点的当前最短路径长度。2)算法步骤:a.初始时,S 只包含源点,即 Sstart,start 的距离为0。U 包含除v外的其他顶点,即:U =其余顶点,若 start 与 U 中顶点 u 有边,则正常有权值,若 u 不是 start 的出边邻接点,则权值为。b.从U中选取一个距离 star
7、t 最小的顶点 k,把 k 加入 S 中(该选定的距离就是 start 到 k 的最短路径长度)。c.以 k 为新考虑的中间点,修改 U 中各顶点的距离;若从源点 start 到顶点 u 的距离(经过顶点 k)比原来距离(不经过顶点 k)短,则修改顶点 u 的距离值,修改后的距离值的顶点 k 的距离加上边上的权。d.重复步骤 b 和 c 直到所有顶点都包含在 S 中。 在执行完迪杰特拉斯算法后,通过访问最短距离数组中的相应元素打印出最短距离。然后对前驱结点编号数组进行调整,再遍历调整后的数组,从而输出途径的各站点。最后根据两两站点间的抽象同路(即弧的邻接矩阵存储结构)进行搜索得出在哪条线路上,
8、从而得出换乘推荐。4.将数据写入磁盘:本次设计的系统面向使用者,故所有初始数据都已经一数组的形式给出,主要包括:图的邻接数组、弧权值数组、站点信息数组、站点编号与名称数组。针对这四个数组,只需要设置四个文件指针,遍历数组的同时分别写入文件即可。函数调用关系如下图1: 按输入条件调用 调用图1 系统函数调用关系图 2 系统需求分析与总体设计2.1系统需求分析用户需要知道是所有线路的信息,包括票价、首班时间、末班时间、沿途经过的所有站点;由于线路可能很多,客户只需要知道摸个具体站点的信息的话,具体到每一个站点,则有站点所在的所有线路以及在相应线路上的上一站,下一站,以及相应的线路的起点终点;客户需
9、要的最重要的是乘车线路推荐,具体表现为输入起点和终点的编号要能够通过程序求出最短距离以及线路推荐。2.2 系统总体设计针对以上需求,系统需要有初始化保存所有信息的功能,在这一部分中,将所有站点的名称、编号;站点间的邻接关系、距离;车次信息(包括票价、首班时间、末班时间等)等信息初始化并保存,以备后续使用。第二个是现实所有线路信息,在这一部分中,要先建立抽象线路图,使用邻接列表的存储方式建立线路图,遍历图打印信息。第三个是站点位置信息的获取,在这一部分总,主要是对图进行遍历,并查找得出所有位置信息。第四部分是最优化路线推荐,在这一部分中主要使用迪杰斯特拉算法得出。最后将所有的初始化信息写入磁盘即
10、可。3 系统详细设计3.1有关数据结构的定义1.站点名称与编号结构:保存站点名称与编号,名称使用字符串结构长度为20个字符:char Station_name20;编号使用整型:int Station_Num;typedef struct char Staton_Name20;int Station_Num;Station_Num;2.图结点结构:有邻接点域,存放与改点相邻的顶点的编号,使用整型 : int VER_j_Num; 抽象站点的名称,使用字符串:char Station_Name20;自引用指针域,指向相邻的下一个节点:Struct TableNode *next;typedef
11、structint VER_j_Num;char Station_Name20;struct TableNode *next;TableNode;3.头结点结构:抽象站点的名称,使用字符串:char Station_Name20;抽象站点编号,整型:int Station_Num;头指针:Struct TableNode *next;typedef structint Station_Num;char Station_Name20;struct TableNode *head;HeadNode;4.图结构:包含一个头结点结构数组:struct HeadNodeMAX_LINE_NUM;type
12、def structstruct HeadNodeMAX_LINE_NUM;MGraph;5.线路信息结构:线路编号,整型:int Line_Num;票价,浮点型:float price;首班时间的小时部分,整型:int Start_Time_Hour;首班时间的分钟部分:整型:int Start_Time_Minute;末班时间的小时部分,整型:int End_Time_Hour;末班时间的分钟部分,整型:int End_Time_Minute;typedef structint Line_Num;int Start_Time_Hour;int Start_Time_Minute;int E
13、nd_Time_Hour;int End_Time_Minute;Line_Info;3.2 主要算法设计1.创建图模型:在建立图模型时,按照线路的结构建立。每一个起点作为一个头结点,每一条单链表代表一条线路。故图的头结点数组长度为MAX_LINE_NUM。此时要使用的辅助存储结构是线路的邻接数组。遍历邻接数组,根据数组数据判断是否有下一结点并读取结点所代表的站点编号。流程图如图2: 是 否 否 是 是 是 否图2:建立线路邻图接列表2.打印线路信息遍历线路信息数组,依次输出每一条线路的票价、首班时间、末班时间等信息;遍历图,每一条链表是一条线路,依次输出站点名称,名称之间用箭头相连,显示出一
14、天线路的感觉。流程图如图3: 否 是 否图3:打印新路信息3.站点定位 有用户输入需要的站点编号,然后程序遍历图模型,当站点编号匹配时,记录下该站点所在的线路编号、线路起点终点、该站点在相应线路上的上一站、下一站。流程图如下图4: 是 否 是 否 是 是 否 是 否 图4:站点定位4.最优化线路推荐5. 使用者对照站点名字与编号输入起点编号与终点编号,则通过程序得出两点间的最短距离以及沿途站点,并给出线路推荐。当两站间有多条线路可以选择时,则给出提示。 该部分使用迪杰特拉斯最短路线算法,使用邻接矩阵的存储结构进行搜索。Dijkstra算法说明如下:1)算法思想:设G=(V,E)是一个带权有向图
15、,把图中顶点集合 V 分成两组,第一组为已求出最短路径的顶点集合(用 S 表示,初始时 S 中只有一个源点,以后每求得一条最短路径,就将加入到集合 S 中,直到全部顶点都加入到 S 中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用 U 表示),按最短路径长度的递增次序依次把第二组的顶点加入 S 中。在加入的过程中,总保持从源点 start 到 S 中各顶点的最短路径长度不大于从源点 start 到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从 start 到此顶点的最短路径长度,U 中的顶点的距离,是从 start 到此顶点只包括 S 中的顶点为中间顶点的当前最短路径长度。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1