c语言深度优先遍历图的代码
时间: 2024-12-24 10:40:33 浏览: 12
在C语言中,深度优先搜索(Depth-First Search,DFS)通常用于遍历无向图或有向图。这里是一个简单的邻接表表示的图的DFS递归实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接列表结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 插入边到邻接表
void addEdge(Node** graph, int src, int dest) {
Node* newNode = createNode(dest);
newNode->next = (*graph)[src];
(*graph)[src] = newNode;
}
// DFS遍历
void dfs(Node** graph, int start, int visited[]) {
if (visited[start]) return; // 如果已访问过跳过
printf("%d ", start); // 访问当前节点
visited[start] = 1; // 标记为已访问
Node* node = (*graph)[start]; // 遍历当前节点的所有邻居
while (node != NULL) {
if (!visited[node->data]) { // 如果邻居未访问
dfs(graph, node->data, visited); // 递归遍历邻居
}
node = node->next;
}
}
int main() {
// 初始化图,例如创建一个3节点的环形图
Node** graph = (Node**)malloc(sizeof(Node*) * 4);
for (int i = 0; i < 4; i++) graph[i] = NULL;
// 添加边(假设节点编号从0开始)
addEdge(graph, 0, 1);
addEdge(graph, 1, 2);
addEdge(graph, 2, 3);
addEdge(graph, 3, 0);
int visited[4] = {0}; // 存储每个节点是否已被访问
dfs(graph, 0, visited);
return 0;
}
```
在这个例子中,`dfs`函数会从起始节点`start`开始,标记它为已访问并打印出来,然后递归地遍历其所有未访问过的邻居。
阅读全文