实验内容与要求: 用C语言设计江西服装学院的校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。 1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图; 2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍; 3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。
时间: 2024-01-22 13:20:19 浏览: 60
这是一个比较典型的图的应用,可以用邻接矩阵表示图,对于每个景点可以用一个结构体来存储它的名称、介绍等信息。在读取文件时,可以按照一定的格式将景点和路径信息存储到对应的数组中,然后初始化邻接矩阵。景点信息查询可以根据输入的景点名称查找对应的结构体,并输出其中的信息。问路查询可以使用Dijkstra算法来解决,找到两个景点之间的最短路径。
以下是一个参考代码,仅供参考:
```c
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define MAX_VERTICES 100
#define INF INT_MAX
typedef struct {
char name[50];
char desc[200];
} Vertex;
Vertex vertices[MAX_VERTICES];
int adj_matrix[MAX_VERTICES][MAX_VERTICES];
int num_vertices = 0;
void add_vertex(char* name, char* desc) {
Vertex v;
strcpy(v.name, name);
strcpy(v.desc, desc);
vertices[num_vertices++] = v;
}
int get_vertex_index(char* name) {
for (int i = 0; i < num_vertices; i++) {
if (strcmp(vertices[i].name, name) == 0) {
return i;
}
}
return -1;
}
void add_edge(char* from, char* to, int cost) {
int i = get_vertex_index(from);
int j = get_vertex_index(to);
adj_matrix[i][j] = cost;
}
void init_graph() {
FILE* fp = fopen("graph.txt", "r");
if (!fp) {
printf("Failed to open file.\n");
return;
}
char line[256];
while (fgets(line, sizeof(line), fp)) {
if (line[0] == '#') {
continue;
}
char from[50], to[50];
int cost;
sscanf(line, "%s %s %d", from, to, &cost);
if (get_vertex_index(from) == -1) {
add_vertex(from, "");
}
if (get_vertex_index(to) == -1) {
add_vertex(to, "");
}
add_edge(from, to, cost);
add_edge(to, from, cost);
}
fclose(fp);
}
void print_vertex_info(char* name) {
int i = get_vertex_index(name);
if (i == -1) {
printf("Vertex not found.\n");
return;
}
printf("Name: %s\n", vertices[i].name);
printf("Description: %s\n", vertices[i].desc);
}
void print_path(int path[], int n, int start, int end) {
if (path[end] == -1) {
printf("No path found.\n");
return;
}
int p[MAX_VERTICES], len = 0;
for (int i = end; i != -1; i = path[i]) {
p[len++] = i;
}
printf("Shortest path from %s to %s: ", vertices[start].name, vertices[end].name);
for (int i = len - 1; i >= 0; i--) {
printf("%s", vertices[p[i]].name);
if (i > 0) {
printf(" -> ");
}
}
printf("\n");
}
void dijkstra(int start, int end) {
int dist[MAX_VERTICES], prev[MAX_VERTICES], visited[MAX_VERTICES];
for (int i = 0; i < num_vertices; i++) {
dist[i] = INF;
prev[i] = -1;
visited[i] = 0;
}
dist[start] = 0;
for (int i = 0; i < num_vertices; i++) {
int u = -1;
for (int j = 0; j < num_vertices; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
if (u == -1 || u == end) {
break;
}
visited[u] = 1;
for (int v = 0; v < num_vertices; v++) {
if (adj_matrix[u][v] != 0) {
int alt = dist[u] + adj_matrix[u][v];
if (alt < dist[v]) {
dist[v] = alt;
prev[v] = u;
}
}
}
}
print_path(prev, num_vertices, start, end);
}
int main() {
init_graph();
printf("Welcome to Jiangxi University of Fashion and Engineering!\n");
printf("Please enter command:\n");
char cmd[50];
while (fgets(cmd, sizeof(cmd), stdin)) {
if (strncmp(cmd, "quit", 4) == 0) {
break;
} else if (strncmp(cmd, "info", 4) == 0) {
char name[50];
sscanf(cmd + 5, "%s", name);
print_vertex_info(name);
} else if (strncmp(cmd, "path", 4) == 0) {
char from[50], to[50];
sscanf(cmd + 5, "%s %s", from, to);
dijkstra(get_vertex_index(from), get_vertex_index(to));
} else {
printf("Invalid command.\n");
}
}
return 0;
}
```
在graph.txt文件中,每一行表示一条路径,格式为“起点 终点 路径长度”,如下所示:
```
图书馆 教学楼1 300
教学楼1 机房楼 200
机房楼 实验楼 100
实验楼 食堂 150
食堂 小卖部 50
小卖部 宿舍楼1 100
宿舍楼1 宿舍楼2 50
宿舍楼2 篮球场 200
篮球场 操场 100
操场 教学楼2 300
教学楼2 教学楼1 200
```
运行程序后,可以输入“info 景点名称”查询景点信息,输入“path 起点 终点”查询最短路径。
阅读全文