设计一个长沙地铁线路查询系统,为长沙地铁乘客咨询从任一个站点到另一个站点之间的最短路径问题。并提供完整的可运行的C语言代码
时间: 2024-03-21 08:40:13 浏览: 110
地铁线路问题.-C语言实现-可连续查询任意站点
5星 · 资源好评率100%
好的,我会为你设计一个长沙地铁线路查询系统。这个系统将使用Dijkstra算法来计算两个站点之间的最短路径。以下是完整的可运行的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STATION_NUM 100 // 最大站点数
#define INF 0x7fffffff // 无穷大
// 地铁站点信息结构体
typedef struct {
char name[20]; // 站名
int line; // 所在线路
} Station;
// 地铁站点信息数组
Station stations[MAX_STATION_NUM];
int stationNum = 0; // 站点数量
// 地铁站点邻接矩阵
int graph[MAX_STATION_NUM][MAX_STATION_NUM];
// Dijkstra算法求最短路径
void dijkstra(int start, int end) {
int dist[MAX_STATION_NUM]; // 起点到各点的最短距离
int prev[MAX_STATION_NUM]; // 最短路径中的前驱节点
int visited[MAX_STATION_NUM]; // 判断节点是否已访问
int i, j, min, next;
// 初始化
for (i = 0; i < stationNum; i++) {
dist[i] = graph[start][i];
visited[i] = 0;
if (dist[i] < INF) {
prev[i] = start;
} else {
prev[i] = -1;
}
}
dist[start] = 0;
visited[start] = 1;
// Dijkstra算法核心部分
for (i = 1; i < stationNum; i++) {
min = INF;
// 找到距离起点最近的未访问节点
for (j = 0; j < stationNum; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
next = j;
}
}
visited[next] = 1;
// 更新其它节点的最短距离
for (j = 0; j < stationNum; j++) {
if (!visited[j] && graph[next][j] < INF && dist[next] + graph[next][j] < dist[j]) {
dist[j] = dist[next] + graph[next][j];
prev[j] = next;
}
}
}
// 输出最短路径
if (dist[end] == INF) {
printf("不存在从%s到%s的路径\n", stations[start].name, stations[end].name);
} else {
printf("从%s到%s的最短路径是:%s", stations[start].name, stations[end].name, stations[start].name);
j = start;
while (j != end) {
j = prev[j];
printf("->%s", stations[j].name);
}
printf("\n最短距离:%d\n", dist[end]);
}
}
int main() {
int i, j, k, n, m, dis;
char name[20], line[20];
int start, end;
// 读入站点信息
printf("请输入站点数量:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("请输入第%d个站点的名字和所在线路(用空格隔开):", i+1);
scanf("%s%s", stations[i].name, line);
stations[i].line = atoi(line);
stationNum++;
}
// 初始化邻接矩阵
for (i = 0; i < stationNum; i++) {
for (j = 0; j < stationNum; j++) {
graph[i][j] = INF;
}
}
// 读入站点间距离
printf("请输入站点间距离数量:");
scanf("%d", &m);
for (i = 0; i < m; i++) {
printf("请输入第%d条线路的起点、终点和距离(用空格隔开):", i+1);
scanf("%s%s%d", name, line, &dis);
for (j = 0; j < stationNum; j++) {
if (strcmp(stations[j].name, name) == 0) {
start = j;
}
if (strcmp(stations[j].name, line) == 0) {
end = j;
}
}
graph[start][end] = graph[end][start] = dis;
}
// 查询最短路径
printf("请输入起点和终点站点名字(用空格隔开):");
scanf("%s%s", name, line);
for (i = 0; i < stationNum; i++) {
if (strcmp(stations[i].name, name) == 0) {
start = i;
}
if (strcmp(stations[i].name, line) == 0) {
end = i;
}
}
dijkstra(start, end);
return 0;
}
```
这个程序可以从终端输入站点信息和站点间距离,然后通过Dijkstra算法计算两个站点之间的最短路径,并输出路径和距离。
阅读全文