用C语言设计校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此
时间: 2024-01-22 13:18:11 浏览: 60
我们可以使用邻接矩阵来存储校园平面图。下面是一个简单的设计:
1. 定义景点结构体
```c
typedef struct {
char name[20]; // 景点名称
char intro[100]; // 景点介绍
} Site;
```
2. 定义邻接矩阵
```c
#define MAX_SITES 8 // 最多景点数
#define INF 0x7fffffff // 无穷大
int graph[MAX_SITES][MAX_SITES]; // 邻接矩阵
Site sites[MAX_SITES]; // 景点数组
```
3. 读取数据
我们可以将景点信息和路径信息保存在一个文件graph.txt中,每行一个景点或路径信息。
```txt
景点1名称
景点1介绍
景点2名称
景点2介绍
...
路径1起点路径1终点路径1长度
路径2起点路径2终点路径2长度
...
```
读取数据的代码如下:
```c
void read_data() {
FILE *fp = fopen("graph.txt", "r");
if (fp == NULL) {
printf("无法打开文件graph.txt\n");
exit(1);
}
// 读取景点信息
for (int i = 0; i < MAX_SITES; i++) {
fgets(sites[i].name, 20, fp);
sites[i].name[strlen(sites[i].name)-1] = '\0'; // 去掉换行符
fgets(sites[i].intro, 100, fp);
sites[i].intro[strlen(sites[i].intro)-1] = '\0';
}
// 初始化邻接矩阵
for (int i = 0; i < MAX_SITES; i++) {
for (int j = 0; j < MAX_SITES; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INF;
}
}
}
// 读取路径信息
int x, y, len;
while (fscanf(fp, "%d%d%d", &x, &y, &len) != EOF) {
graph[x][y] = len;
graph[y][x] = len;
}
fclose(fp);
}
```
4. 显示景点信息
```c
void show_sites() {
printf("校园景点信息:\n");
for (int i = 0; i < MAX_SITES; i++) {
printf("%d. %s:%s\n", i, sites[i].name, sites[i].intro);
}
}
```
5. 寻找最短路径
这里我们使用Dijkstra算法来寻找最短路径。
```c
void dijkstra(int start, int end) {
int dist[MAX_SITES]; // 距离数组
int visited[MAX_SITES]; // 已访问数组
int path[MAX_SITES]; // 路径数组
// 初始化
for (int i = 0; i < MAX_SITES; i++) {
dist[i] = graph[start][i];
visited[i] = 0;
if (dist[i] < INF) {
path[i] = start;
} else {
path[i] = -1;
}
}
visited[start] = 1;
// 循环n-1次
for (int i = 0; i < MAX_SITES-1; i++) {
// 找到距离起点最近的未访问点
int min_dist = INF, min_index = -1;
for (int j = 0; j < MAX_SITES; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_index = j;
}
}
if (min_index == -1) {
break;
}
// 标记该点已访问
visited[min_index] = 1;
// 更新距离数组和路径数组
for (int j = 0; j < MAX_SITES; j++) {
if (!visited[j] && graph[min_index][j] < INF && dist[min_index]+graph[min_index][j] < dist[j]) {
dist[j] = dist[min_index] + graph[min_index][j];
path[j] = min_index;
}
}
}
// 输出结果
printf("从%s到%s的最短路径为:", sites[start].name, sites[end].name);
int p = end;
int stack[MAX_SITES], top = 0;
while (p != start) {
stack[top++] = p;
p = path[p];
}
stack[top++] = start;
while (top > 0) {
printf("%s", sites[stack[--top]].name);
if (top > 0) {
printf("->");
}
}
printf("\n");
printf("路径长度为:%d米\n", dist[end]);
}
```
6. 主函数
```c
int main() {
read_data();
show_sites();
dijkstra(0, 7);
return 0;
}
```
这样,我们就实现了一个简单的校园平面图的设计。