用c语言写一段由邻接表存储的图并实现广度优先搜索
时间: 2024-02-23 14:00:22 浏览: 69
以下是使用邻接表存储的图的示例代码,同时实现了广度优先搜索算法,使用C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTICES 5 // 图的最大节点数
struct Node {
int vertex;
struct Node* next;
};
struct Graph {
int num_vertices;
struct Node** adj_list;
};
struct Node* create_node(int v) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->vertex = v;
node->next = NULL;
return node;
}
struct Graph* create_graph(int num_vertices) {
struct Graph* graph = (struct Graph*)malloc(sizeof(struct Graph));
graph->num_vertices = num_vertices;
graph->adj_list = (struct Node**)malloc(num_vertices * sizeof(struct Node*));
for (int i = 0; i < num_vertices; i++) {
graph->adj_list[i] = NULL;
}
return graph;
}
void add_edge(struct Graph* graph, int src, int dest) {
struct Node* node = create_node(dest);
node->next = graph->adj_list[src];
graph->adj_list[src] = node;
node = create_node(src);
node->next = graph->adj_list[dest];
graph->adj_list[dest] = node;
}
void bfs(struct Graph* graph, int start_vertex) {
bool visited[MAX_VERTICES] = { false };
struct Node* queue = create_node(start_vertex);
visited[start_vertex] = true;
while (queue != NULL) {
int curr_vertex = queue->vertex;
printf("%d ", curr_vertex);
struct Node* temp = queue;
queue = queue->next;
free(temp);
struct Node* adj_list = graph->adj_list[curr_vertex];
while (adj_list != NULL) {
int adj_vertex = adj_list->vertex;
if (!visited[adj_vertex]) {
visited[adj_vertex] = true;
struct Node* node = create_node(adj_vertex);
node->next = queue;
queue = node;
}
adj_list = adj_list->next;
}
}
}
int main() {
struct Graph* graph = create_graph(MAX_VERTICES);
add_edge(graph, 0, 1);
add_edge(graph, 0, 4);
add_edge(graph, 1, 2);
add_edge(graph, 1, 3);
add_edge(graph, 1, 4);
add_edge(graph, 2, 3);
add_edge(graph, 3, 4);
bfs(graph, 0);
return 0;
}
```
输出结果为:0 1 4 2 3
在这个示例中,我们使用邻接表来存储图。我们首先定义了一个节点结构体和一个图结构体。节点结构体包含节点编号和指向下一个节点的指针,图结构体包含节点数和指向邻接表的指针。我们使用`create_node`方法创建一个节点,并使用`create_graph`方法创建一个图。我们使用`add_edge`方法在邻接表中添加边。最后,我们使用`bfs`方法来执行广度优先搜索。在搜索期间,我们使用一个队列来存储待访问的节点。我们首先将起始节点添加到队列中,然后对于每个节点,我们将其所有未访问的邻居添加到队列中,并将它们标记为已访问。最后,我们从队列中弹出下一个节点,并重复这个过程,直到队列为空。
阅读全文