21xrx.com
2024-11-22 07:01:01 Friday
登录
文章检索 我的文章 写文章
深度优先搜索算法在C语言中的演示
2023-09-16 18:00:35 深夜i     --     --
深度优先搜索算法 C语言 演示

深度优先搜索算法是一种常用的图搜索算法,其核心思想是从图的某个节点出发,沿着一条路径尽可能深地搜索,直到遇到无法继续的节点,然后回溯到上一个节点,继续搜索其他路径。这一过程一直进行到所有可达节点都被遍历为止。

在C语言中,我们可以使用邻接表或者邻接矩阵来表示图。邻接表是指用一个数组存储图中的所有节点,每个节点对应一个链表,链表中存储了该节点与其他节点之间的边。邻接矩阵则是通过一个二维矩阵来记录节点之间的关系,矩阵中的元素表示两个节点之间是否有边相连。

下面是一个使用邻接表表示图,并演示深度优先搜索算法的C语言代码:


#include <stdio.h>

#include <stdlib.h>

// 定义图的最大节点数

#define MAX_NODES 100

// 链表节点

typedef struct Node {

  int value;      // 节点的值

  struct Node* next;  // 指向下一个节点的指针

} Node;

// 图

typedef struct Graph {

  int numNodes;    // 节点数量

  Node* adjacencyList[MAX_NODES];  // 邻接表

  int visited[MAX_NODES];      // 用于记录节点是否被访问过

} Graph;

// 初始化图

void initGraph(Graph* graph, int numNodes) {

  graph->numNodes = numNodes;

  for (int i = 0; i < numNodes; i++) {

    graph->adjacencyList[i] = NULL;  // 所有节点的链表初始化为空

    graph->visited[i] = 0;      // 所有节点初始化为未访问状态

  }

}

// 添加边

void addEdge(Graph* graph, int node1, int node2) {

  Node* newNode = (Node*)malloc(sizeof(Node));

  newNode->value = node2;

  newNode->next = graph->adjacencyList[node1];

  graph->adjacencyList[node1] = newNode;

}

// 深度优先搜索

void DFS(Graph* graph, int node) {

  graph->visited[node] = 1;  // 标记当前节点为已访问

  printf("%d ", node);

  Node* adjacentNode = graph->adjacencyList[node];

  while (adjacentNode != NULL) {

    if (!graph->visited[adjacentNode->value]) {

      DFS(graph, adjacentNode->value);  // 递归搜索相邻未访问过的节点

    }

    adjacentNode = adjacentNode->next;

  }

}

int main() {

  Graph graph;

  int numNodes = 6;

  initGraph(&graph, numNodes);

  addEdge(&graph, 0, 1);

  addEdge(&graph, 0, 2);

  addEdge(&graph, 1, 3);

  addEdge(&graph, 1, 4);

  addEdge(&graph, 2, 5);

  printf("深度优先搜索结果:");

  DFS(&graph, 0);

  return 0;

}

在上述代码中,我们首先定义了`Node`结构体和`Graph`结构体,分别用于表示链表中的节点和图。`initGraph`函数用于初始化图,`addEdge`函数用于添加边。

在`DFS`函数中,我们首先将当前节点标记为已访问,并输出当前节点的值。然后,我们对当前节点所有相邻未访问过的节点递归地进行深度优先搜索。

最后,在`main`函数中,我们创建了一个具有6个节点的图,并添加了一些边。然后,我们调用`DFS`函数从节点0开始进行深度优先搜索,并输出结果。

运行以上代码,输出的深度优先搜索结果为:`0 2 5 1 4 3`。

综上所述,我们演示了在C语言中使用邻接表表示图,并使用深度优先搜索算法进行遍历。深度优先搜索是一种非常常用的图搜索算法,可以用于解决许多问题,如连通性判断、路径查找等。因此,熟练掌握深度优先搜索算法及其在C语言中的实现对于解决图相关问题非常重要。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复