在C语言中如何通过邻接表实现深度优先搜索(DFS)和广度优先搜索(BFS)?请给出具体的代码示例。
时间: 2024-11-14 11:39:40 浏览: 72
在数据结构中,图的邻接表表示是一种高效的空间优化方法,特别适用于稀疏图。为了帮助你理解如何在C语言中使用邻接表来实现深度优先搜索(DFS)和广度优先搜索(BFS),这里提供了一个详细的代码示例。
参考资源链接:[图的深度优先搜索与广度优先搜索(邻接表实现)](https://wenku.csdn.net/doc/zh0dp2xv7x?spm=1055.2569.3001.10343)
首先,我们需要定义图的数据结构,包括顶点、边以及邻接表的结构。以下是图的邻接表结构的C语言表示:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 10 // 最大顶点数
typedef struct ArcNode {
int adjvex; // 边指向的顶点的位置
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点信息
ArcNode *first; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTICES];
typedef struct {
AdjList vertices; // 图中所有顶点的数组
int vexnum, arcnum; // 图中当前的顶点数和边数
} ALGraph;
void CreateALGraph(ALGraph *G, int vexnum, int arcnum) {
// 初始化图结构
G->vexnum = vexnum;
G->arcnum = arcnum;
for (int i = 0; i < vexnum; ++i) {
G->vertices[i].data = i;
G->vertices[i].first = NULL;
}
// 添加边
// ...
}
void DFS(int v, int visited[], ALGraph G) {
// 深度优先搜索递归函数
// ...
}
void BFS(int s, ALGraph G) {
// 广度优先搜索函数
// ...
}
int main() {
ALGraph G;
CreateALGraph(&G, MAX_VERTICES, /* edge number */);
int visited[MAX_VERTICES] = {0}; // 初始化访问标记数组
int start_vertex = 0; // 假设从顶点0开始搜索
DFS(start_vertex, visited, G);
// 重新初始化visited数组用于BFS
for (int i = 0; i < MAX_VERTICES; ++i) visited[i] = 0;
BFS(start_vertex, G);
return 0;
}
```
在上述代码中,我们首先定义了图的邻接表结构,然后通过`CreateALGraph`函数初始化图并添加边。`DFS`函数和`BFS`函数分别实现深度优先搜索和广度优先搜索。`DFS`函数使用递归方式来访问每个顶点的相邻顶点,而`BFS`函数则利用队列来进行层次遍历。
通过这个示例,你可以看到邻接表在表示图和执行图搜索算法时的灵活性和效率。同时,邻接表与邻接矩阵相比,能够节省大量不必要的空间,尤其是当处理稀疏图时更为明显。
为了进一步深入学习图的遍历算法及其在邻接表上的实现,建议参阅以下资料:《图的深度优先搜索与广度优先搜索(邻接表实现)》。这本资料提供了完整的邻接表实现的DFS和BFS程序,涵盖了理论知识和代码实现,对于想要提高数据结构实践能力的读者来说是一份宝贵的资源。
参考资源链接:[图的深度优先搜索与广度优先搜索(邻接表实现)](https://wenku.csdn.net/doc/zh0dp2xv7x?spm=1055.2569.3001.10343)
阅读全文