实现图的深度优先遍历,c语言代码
时间: 2024-12-15 09:18:03 浏览: 31
在C语言中,我们可以使用递归或栈数据结构来实现深度优先搜索(DFS)。这里提供一个基本的使用递归的版本:
```c
#include <stdio.h>
#include <stdbool.h>
// 图的邻接表表示
typedef struct {
int v; // 节点值
struct Node* adj; // 邻接节点指针列表
} Node;
typedef struct {
Node* nodes;
int size;
} Graph;
void addEdge(Graph* graph, int u, int v) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->v = v;
newNode->adj = NULL;
if(graph->size == graph->nodes->size) {
Node** newNodes = realloc(graph->nodes, sizeof(Node*) * (graph->size + 1));
graph->nodes = newNodes;
}
graph->nodes[graph->size++] = newNode;
((Node*)graph->nodes[u])->adj = newNode;
}
void dfs(Graph* graph, int start, bool visited[]) {
visited[start] = true;
printf("%d ", start);
for(Node* node = graph->nodes[start]; node != NULL; node = node->adj) {
if(!visited[node->v]) {
dfs(graph, node->v, visited);
}
}
}
int main() {
Graph g;
g.size = 0;
g.nodes = (Node**)malloc(sizeof(Node*) * 5); // 假设我们有5个节点
// 添加边
addEdge(&g, 0, 1);
addEdge(&g, 0, 2);
addEdge(&g, 1, 2);
addEdge(&g, 2, 0);
addEdge(&g, 2, 3);
addEdge(&g, 3, 3); // 无向环
bool visited[5];
for(int i = 0; i < 5; i++) {
visited[i] = false;
}
printf("Depth First Search traversal starting from vertex %d:\n", 0);
dfs(&g, 0, visited);
return 0;
}
```
在这个例子中,首先定义了图的邻接表结构,然后创建了一个`dfs`函数用于深度优先遍历。`main`函数中初始化了一个小规模的图,并添加了一些边。最后调用`dfs`从节点0开始遍历。
阅读全文