|
|
|
@ -95,31 +95,7 @@ struct Station {
|
|
|
|
|
struct Station stations[MAX_STATION_NUM]; // 站点数组
|
|
|
|
|
在这个结构中,我们为每个站点记录了它的名称、编号和相邻节点链表的头节点指针。这样的话,我们就可以通过遍历这些链表来获取某一站点的所有邻居站点。同时,由于链表中的每个节点包含了相邻站点的编号和连接权重,因此我们也可以在搜索路径时方便地计算出经过某一条路径的总长度或换乘次数。
|
|
|
|
|
|
|
|
|
|
示意图如下,表示了一个包含 4 个站点和 5 条连接边的地铁网络的邻接表结构:
|
|
|
|
|
stations[]:
|
|
|
|
|
index 0 1 2 3
|
|
|
|
|
+---------+---------+---------+---------+
|
|
|
|
|
| name | id | head | |
|
|
|
|
|
+---------+---------+---------+---------+
|
|
|
|
|
| "PARK" | 0 | +---|-----+ |
|
|
|
|
|
+---------+---------+---------+---------+
|
|
|
|
|
| "GATE" | 1 | +---|-----+ |
|
|
|
|
|
+---------+---------+---------+---------+
|
|
|
|
|
| "TOWER" | 2 | +---|-----|--+|
|
|
|
|
|
+---------+---------+---------+----|----+
|
|
|
|
|
| "HALL" | 3 | +---|-----+ |
|
|
|
|
|
+---------+---------+---------+---------+
|
|
|
|
|
|
|
|
|
|
adj_list[]:
|
|
|
|
|
station 0: PARK
|
|
|
|
|
head -> O |weight=5| -> 1 |weight=3| -> 2 |weight=1| -> null
|
|
|
|
|
station 1: GATE
|
|
|
|
|
head -> O |weight=3| -> 0 |weight=4| -> 3 |weight=2| -> 2 |weight=1| -> null
|
|
|
|
|
station 2: TOWER
|
|
|
|
|
head -> O |weight=1| -> 1 |weight=1| -> 3 |weight=3| -> null
|
|
|
|
|
station 3: HALL
|
|
|
|
|
head -> O |weight=2| -> 1 |weight=5| -> null
|
|
|
|
|
在这个示意图中,stations 数组中的每个元素都包含了它所代表的站点的名称、编号和相邻节点链表的头节点指针。例如,stations[0] 表示 "PARK" 站,它的编号为 0,与相邻的站点是 "GATE"、"TOWER" 和 "HALL"。其中,与 "GATE" 站相连的边的权重为 5,与 "TOWER" 相连的边的权重为 3,与 "HALL" 相连的边的权重为 1。而对应的 adj_list 数组则记录了每个站点相邻节点链表的具体内容,其中每个节点包含了相邻站点的编号和连接权重。
|
|
|
|
|
|
|
|
|
|
2.3 算法设计
|
|
|
|
|
我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。
|
|
|
|
|
Dijkstra算法
|
|
|
|
@ -203,33 +179,27 @@ private:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#4. 系统测试
|
|
|
|
|
系统测试思路和方法:
|
|
|
|
|
|
|
|
|
|
根据设计方案,测试系统的功能是否完备,包括地铁线路查询、路径规划、站点信息查询等。
|
|
|
|
|
针对不同功能,设计测试用例,包括正常情况、边界情况、异常情况等。
|
|
|
|
|
给出输入和预期结果,并记录运行结果和是否通过测试,以便后续分析和修改。
|
|
|
|
|
特殊情况:
|
|
|
|
|
|
|
|
|
|
输入为空
|
|
|
|
|
输入为非法字符或格式
|
|
|
|
|
查询的线路、站点不存在
|
|
|
|
|
查询的起点和终点在同一站点
|
|
|
|
|
查询的起点和终点不在同一线路上
|
|
|
|
|
测试用例:
|
|
|
|
|
|
|
|
|
|
地铁线路查询: 输入:查询所有地铁线路
|
|
|
|
|
预期结果:返回所有线路信息
|
|
|
|
|
运行结果:通过
|
|
|
|
|
路径规划: 输入:从A站到B站
|
|
|
|
|
预期结果:返回从A站到B站的最短路径
|
|
|
|
|
运行结果:通过
|
|
|
|
|
站点信息查询: 输入:查询C站信息
|
|
|
|
|
预期结果:返回C站的详细信息
|
|
|
|
|
运行结果:通过
|
|
|
|
|
特殊情况: 输入为空、非法字符或格式、查询的线路、站点不存在、查询的起点和终点在同一站点、查询的起点和终点不在同一线路上
|
|
|
|
|
预期结果:返回错误提示信息
|
|
|
|
|
运行结果:通过
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(1)输入:1
|
|
|
|
|
结果:输出了所有的站点及简略介绍
|
|
|
|
|
(2)输入:2
|
|
|
|
|
结果:请问您要查询的地点编号是:10
|
|
|
|
|
编号:10
|
|
|
|
|
地点:雍和宫
|
|
|
|
|
介绍:位于北京市东城区北二环安定门东大街与雍和宫大街、和平里西街交汇处
|
|
|
|
|
按任意键返回!
|
|
|
|
|
(3)输入:3
|
|
|
|
|
结果:请输入查询的地点:3
|
|
|
|
|
到达地点 1的总距离为: 30 , 经过路径为:3
|
|
|
|
|
到达地点 2的总距离为: 60 , 经过路径为:3--->1--->2
|
|
|
|
|
到达地点 3的总距离为: 0 , 经过路径为:3
|
|
|
|
|
到达地点 4的总距离为: 100 , 经过路径为:3--->5--->4
|
|
|
|
|
到达地点 5的总距离为: 50 , 经过路径为:3--->5
|
|
|
|
|
…
|
|
|
|
|
(4)输入:4
|
|
|
|
|
结果:请输入查询的地点:3
|
|
|
|
|
请输入目的地点:5
|
|
|
|
|
总距离是: 50 , 经过路径为:3--->5
|
|
|
|
|
|
|
|
|
|
#5. 总结
|
|
|
|
|
我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右
|