编写一个程序,实现图的深度优先遍历算法,并在主函数中输出下图从顶点A开始的一个深度优先遍历序列。c语言实现
时间: 2024-12-11 21:25:04 浏览: 21
在C语言中,我们可以使用递归的方式来实现深度优先遍历(Depth First Search, DFS)算法。下面是一个简单的例子,假设我们有一个无向图,用邻接表表示,顶点用数组存储,边用索引对表示。这里我们仅展示核心部分的代码,实际应用时需要创建完整的结构并处理输入数据。
```c
#include <stdio.h>
#include <stdbool.h>
#define V 5 // 图的顶点数
// 图的邻接列表表示
typedef struct {
int dest; // 目标顶点
struct Node* next; // 指向下个边
} Edge;
// 结构体表示节点
struct Node {
int data;
Edge* adj; // 边指向的链表
};
void addEdge(int src, int dest, struct Node** graph) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = dest;
newNode->adj = NULL;
if (*graph == NULL) {
*graph = newNode;
} else {
struct Node* last = *graph;
while (last->adj != NULL) {
last = last->adj;
}
last->adj = newNode;
}
}
// 递归实现DFS
bool dfsUtil(int v, struct Node* graph, bool visited[]) {
printf("%d ", v); // 输出当前访问的顶点
visited[v] = true;
struct Node* node = graph[v].adj;
while (node != NULL) {
if (!visited[node->data]) {
if (dfsUtil(node->data, graph, visited)) return true; // 如果深入后返回true,则停止该路径的搜索
}
node = node->next;
}
return false; // 当前路径结束后返回false
}
// 主函数
int main() {
struct Node* graph[V];
for (int i = 0; i < V; i++) {
graph[i] = NULL;
}
// 假设给定的图连接如下:
// A -> B, A -> C, B -> D, C -> D, C -> E
addEdge(0, 1, &graph[0]); // A-B
addEdge(0, 2, &graph[0]); // A-C
addEdge(1, 3, &graph[1]); // B-D
addEdge(2, 3, &graph[2]); // C-D
addEdge(2, 4, &graph[2]); // C-E
bool visited[V] = {false}; // 初始化所有顶点未访问
dfsUtil(0, graph, visited); // 从顶点A开始遍历
return 0;
}
```
当运行这个程序时,它会输出从顶点A开始的一条深度优先遍历序列。注意,这只是一个基础示例,实际应用可能会更复杂,包括错误检查、用户输入读取等。
阅读全文