用c语言实现用邻接矩阵存储的图的广度度优先遍历,用邻接表存储的图的广度、深度优先遍历。
时间: 2024-11-04 09:14:03 浏览: 2
C++实现图的邻接表存储和广度优先遍历实例分析
在C语言中,我们可以分别用邻接矩阵和邻接表这两种数据结构来存储图,然后实现广度优先遍历(Breadth First Search, BFS)。
**邻接矩阵存储的图的广度优先遍历:**
邻接矩阵适用于稠密图,可以快速查找两个顶点之间是否有边。以下是BFS的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 邻接矩阵的BFS
void bfs_matrix(Graph matrix, int source) {
int n = sizeof(matrix) / sizeof(matrix[0]);
int visited[n];
memset(visited, 0, sizeof(visited));
queue_t *q = create_queue(n);
enqueue(q, source);
while (!is_empty(q)) {
int current = dequeue(q);
printf("%d ", current);
for (int i = 0; i < n; i++) {
if (matrix[current][i] && !visited[i]) {
visited[i] = 1;
enqueue(q, i);
}
}
}
destroy_queue(q);
}
// 主函数调用
int main() {
// 初始化矩阵...
bfs_matrix(graph_matrix, 0); // 从0开始遍历
return 0;
}
```
注意:`queue_t`, `enqueue`, `dequeue`, 和 `create_queue`, `destroy_queue` 等函数需要你自己实现队列数据结构。
**邻接表存储的图的广度/深度优先遍历:**
邻接表更适合稀疏图,因为它只存储实际存在的边。下面是邻接表中BFS和DFS的实现:
```c
Node* adj_list[] = {...}; // 邻接表结构
// 邻接表的BFS
void bfs_adj_list(int source, int vertices) {
int visited[vertices] = {0};
queue_t *q = create_queue(vertices);
enqueue(q, source);
while (!is_empty(q)) {
int current = dequeue(q);
printf("%d ", current);
Node* temp = adj_list[current];
while (temp != NULL) {
int neighbor = temp->data;
if (!visited[neighbor]) {
visited[neighbor] = 1;
enqueue(q, neighbor);
}
temp = temp->next;
}
}
destroy_queue(q);
}
// DFS
void dfs_adj_list(int source, int vertices) {
stack_t *s = create_stack(vertices);
push(s, source);
while (!is_empty(s)) {
int current = pop(s);
printf("%d ", current);
Node* temp = adj_list[current];
while (temp != NULL) {
int neighbor = temp->data;
if (!visited[neighbor]) {
visited[neighbor] = 1;
push(s, neighbor);
}
temp = temp->next;
}
}
destroy_stack(s);
}
// 主函数调用
int main() {
bfs_adj_list(0, V);
dfs_adj_list(0, V);
return 0;
}
```
这里假设`adj_list`是一个数组,每个元素都是指向链表头结点的指针。同样,你需要提供`stack_t`, `push`, `pop`, 和 `create_stack`, `destroy_stack` 函数来实现栈数据结构。
阅读全文