有向图邻接表的广度优先搜索与深度优先遍历完整代码用c语言
时间: 2023-12-16 19:09:20 浏览: 91
数据结构-c语言-带main函数-图7.3-图的遍历-广度优先搜索-队列-邻接表-无向图。
5星 · 资源好评率100%
好的,下面是有向图邻接表的广度优先搜索和深度优先遍历的完整代码,使用 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXN 1000
struct Graph {
int n;
int adj_list[MAXN][MAXN];
};
struct Graph* create_graph(int n) {
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
graph->n = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
graph->adj_list[i][j] = 0;
}
}
return graph;
}
void add_edge(struct Graph* graph, int u, int v) {
graph->adj_list[u][v] = 1;
}
void bfs(struct Graph* graph, int start) {
bool visited[MAXN] = {false};
int queue[MAXN];
int front = 0, rear = 0;
queue[rear++] = start;
visited[start] = true;
while (front < rear) {
int v = queue[front++];
printf("%d ", v);
for (int u = 0; u < graph->n; u++) {
if (graph->adj_list[v][u] && !visited[u]) {
queue[rear++] = u;
visited[u] = true;
}
}
}
}
void dfs(struct Graph* graph, int v, bool visited[]) {
visited[v] = true;
printf("%d ", v);
for (int u = 0; u < graph->n; u++) {
if (graph->adj_list[v][u] && !visited[u]) {
dfs(graph, u, visited);
}
}
}
void dfs_traversal(struct Graph* graph) {
bool visited[MAXN] = {false};
for (int v = 0; v < graph->n; v++) {
if (!visited[v]) {
dfs(graph, v, visited);
}
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
struct Graph* graph = create_graph(n);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add_edge(graph, u, v);
}
int start;
scanf("%d", &start);
bfs(graph, start);
printf("\n");
dfs_traversal(graph);
printf("\n");
return 0;
}
```
其中,Graph 结构体表示一个有向图,n 表示顶点的数量,adj_list 是邻接表,使用二维数组实现。create_graph 函数用于创建一个有 n 个顶点的图,并初始化邻接表。add_edge 函数用于添加一条从顶点 u 到顶点 v 的有向边。bfs 函数实现了广度优先搜索,dfs 函数实现了深度优先遍历,dfs_traversal 函数用于遍历整个图。在 dfs 函数中,visited 数组用于记录每个顶点是否被访问过,v 表示当前访问的顶点。在 dfs_traversal 函数中,首先初始化 visited 数组,然后从每个未被访问过的顶点开始执行 dfs。在主函数中,首先读入图的信息,然后调用 bfs 和 dfs_traversal 函数进行遍历。
阅读全文