用数据结构c
时间: 2023-07-27 18:26:40 浏览: 41
好的,我们可以使用C语言中的结构体和邻接表来实现校园导览系统。以下是一个可能的实现:
1. 定义结构体表示景点信息:
```c
struct Spot {
char name[50]; // 景点名称
char code[10]; // 景点代号
char intro[200]; // 景点简介
};
```
2. 定义结构体表示路径信息:
```c
struct Path {
int length; // 路径长度
};
```
3. 定义邻接表节点结构体,表示图中每个顶点:
```c
struct Node {
struct Spot spot; // 景点信息
struct Edge *head; // 与该顶点相连的边链表头指针
};
struct Edge {
int dest; // 边的目标顶点
struct Path path; // 边的路径信息
struct Edge *next; // 指向下一条边的指针
};
```
4. 定义图结构体,表示整个校园导览系统:
```c
struct Graph {
int num_spots; // 图中顶点个数
struct Node *nodes; // 存储所有顶点的数组指针
};
```
5. 实现图的初始化函数,创建邻接表:
```c
struct Graph *createGraph(int num_spots) {
struct Graph *graph = (struct Graph *) malloc(sizeof(struct Graph));
graph->num_spots = num_spots;
graph->nodes = (struct Node *) malloc(sizeof(struct Node) * num_spots);
for (int i = 0; i < num_spots; i++) {
graph->nodes[i].spot = initial_spot_info(); // 初始化景点信息
graph->nodes[i].head = NULL; // 初始化边链表为空
}
return graph;
}
```
6. 实现添加边的函数,建立景点之间的关联关系:
```c
void addEdge(struct Graph *graph, int src, int dest, int length) {
struct Edge *edge = (struct Edge *) malloc(sizeof(struct Edge));
edge->dest = dest;
edge->path.length = length;
edge->next = graph->nodes[src].head;
graph->nodes[src].head = edge;
}
```
7. 实现查询景点信息的函数:
```c
struct Spot querySpotInfo(struct Graph *graph, char *name_or_code) {
for (int i = 0; i < graph->num_spots; i++) {
if (strcmp(graph->nodes[i].spot.name, name_or_code) == 0 || strcmp(graph->nodes[i].spot.code, name_or_code) == 0) {
return graph->nodes[i].spot;
}
}
struct Spot null_spot = {"", "", ""};
return null_spot;
}
```
8. 实现查询最短路径的函数,使用Dijkstra算法:
```c
void dijkstra(struct Graph *graph, int src, int *dist, int *prev) {
int num_spots = graph->num_spots;
bool *visited = (bool *) malloc(sizeof(bool) * num_spots);
for (int i = 0; i < num_spots; i++) {
dist[i] = INT_MAX;
prev[i] = -1;
visited[i] = false;
}
dist[src] = 0;
for (int i = 0; i < num_spots; i++) {
int min_dist = INT_MAX;
int u = -1;
// 找出未访问过且距离最短的顶点
for (int j = 0; j < num_spots; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
u = j;
}
}
if (u == -1) break;
visited[u] = true;
// 更新未访问过的相邻顶点的距离
struct Edge *edge = graph->nodes[u].head;
while (edge != NULL) {
int v = edge->dest;
int alt = dist[u] + edge->path.length;
if (alt < dist[v]) {
dist[v] = alt;
prev[v] = u;
}
edge = edge->next;
}
}
free(visited);
}
void printPath(struct Graph *graph, int *prev, int dest) {
if (prev[dest] != -1) {
printPath(graph, prev, prev[dest]);
}
printf("%s -> ", graph->nodes[dest].spot.name);
}
void queryShortestPath(struct Graph *graph, char *start, char *end) {
int start_id = -1, end_id = -1;
for (int i = 0; i < graph->num_spots; i++) {
if (strcmp(graph->nodes[i].spot.name, start) == 0 || strcmp(graph->nodes[i].spot.code, start) == 0) {
start_id = i;
}
if (strcmp(graph->nodes[i].spot.name, end) == 0 || strcmp(graph->nodes[i].spot.code, end) == 0) {
end_id = i;
}
}
if (start_id == -1 || end_id == -1) {
printf("无法找到对应景点\n");
return;
}
int *dist = (int *) malloc(sizeof(int) * graph->num_spots);
int *prev = (int *) malloc(sizeof(int) * graph->num_spots);
dijkstra(graph, start_id, dist, prev);
if (dist[end_id] == INT_MAX) {
printf("无法到达目的地\n");
} else {
printf("最短路径为:");
printPath(graph, prev, end_id);
printf("\n路径长度为:%d\n", dist[end_id]);
}
free(dist);
free(prev);
}
```
以上是一个简单的数据结构C语言实现的校园导览系统的示例。