图的遍历算法 采用邻接表的DFS算法C语言
时间: 2023-07-10 22:33:26 浏览: 89
好的,以下是采用邻接表表示图的 DFS 算法的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
struct Node {
int val;
struct Node** neighbors;
int num_neighbors;
int visited;
};
// 创建节点函数
struct Node* createNode(int val, int num_neighbors) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->val = val;
node->num_neighbors = num_neighbors;
node->visited = 0;
node->neighbors = (struct Node**)malloc(sizeof(struct Node*) * num_neighbors);
return node;
}
// 添加邻居节点函数
void addNeighbor(struct Node* node, int index, struct Node* neighbor) {
node->neighbors[index] = neighbor;
}
// 定义 DFS 函数
void dfs(struct Node* node) {
// 访问当前节点
printf("%d ", node->val);
// 标记当前节点为已访问
node->visited = 1;
// 递归遍历节点的邻居节点
for (int i = 0; i < node->num_neighbors; i++) {
struct Node* neighbor = node->neighbors[i];
if (!neighbor->visited) {
dfs(neighbor);
}
}
}
int main() {
// 创建图
struct Node* node1 = createNode(1, 2);
struct Node* node2 = createNode(2, 3);
struct Node* node3 = createNode(3, 2);
struct Node* node4 = createNode(4, 2);
struct Node* node5 = createNode(5, 2);
struct Node* node6 = createNode(6, 1);
addNeighbor(node1, 0, node2);
addNeighbor(node1, 1, node3);
addNeighbor(node2, 0, node1);
addNeighbor(node2, 1, node4);
addNeighbor(node2, 2, node5);
addNeighbor(node3, 0, node1);
addNeighbor(node3, 1, node6);
addNeighbor(node4, 0, node2);
addNeighbor(node4, 1, node5);
addNeighbor(node5, 0, node2);
addNeighbor(node5, 1, node4);
addNeighbor(node6, 0, node3);
// 遍历图
dfs(node1);
return 0;
}
```
在这段代码中,我们首先定义了一个 Node 结构体来表示图中的节点,每个节点包含一个值(val)、一个邻居节点数组(neighbors)和邻居节点的数量(num_neighbors)。我们使用邻接表来表示整个图。然后,我们定义了一个 createNode 函数来创建一个新节点,并定义一个 addNeighbor 函数来将一个节点添加到另一个节点的邻居节点列表中。
接着,我们定义了一个 dfs 函数来进行深度优先遍历。我们从起始节点开始遍历,并对每个节点进行访问。在访问每个节点之前,我们将其标记为已访问,以避免重复访问。接着,我们递归遍历该节点的邻居节点,并对每个邻居节点进行同样的操作。最后,我们创建了一个 visited 标记来保存已经访问过的节点,以确保每个节点只被访问一次。
在 main 函数中,我们创建了一个图,并调用 dfs 函数来遍历整个图。
阅读全文