c语言写一段代码,输入有向图,用递归方法和非递归方法求优先深度搜索的结果,两种方法写在一个代码里
时间: 2024-03-18 18:41:12 浏览: 112
以下是C语言中实现有向图深度优先搜索(DFS)的代码,包括递归方法和非递归方法:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX 100
// 定义图结构体
typedef struct {
int **matrix; // 邻接矩阵
int vertex_num; // 顶点数
int edge_num; // 边数
} Graph;
// 初始化图
Graph* init_graph(int vertex_num) {
Graph* G = (Graph*) malloc(sizeof(Graph));
G->vertex_num = vertex_num;
G->edge_num = 0;
G->matrix = (int**) malloc(vertex_num * sizeof(int*));
for(int i=0; i<vertex_num; i++) {
G->matrix[i] = (int*) calloc(vertex_num, sizeof(int));
}
return G;
}
// 添加边
void add_edge(Graph* G, int v1, int v2) {
G->matrix[v1][v2] = 1;
G->edge_num++;
}
// 递归实现的DFS
void dfs_recursive(Graph* G, int v, int* visited) {
visited[v] = 1;
printf("%d ", v);
for(int i=0; i<G->vertex_num; i++) {
if(G->matrix[v][i] && !visited[i]) {
dfs_recursive(G, i, visited);
}
}
}
// 非递归实现的DFS
void dfs_iterative(Graph* G, int v, int* visited) {
int stack[MAX_VERTEX];
int top = -1;
stack[++top] = v;
visited[v] = 1;
while(top >= 0) {
int cur = stack[top--];
printf("%d ", cur);
for(int i=0; i<G->vertex_num; i++) {
if(G->matrix[cur][i] && !visited[i]) {
stack[++top] = i;
visited[i] = 1;
}
}
}
}
int main() {
int vertex_num, edge_num;
printf("请输入顶点数和边数:");
scanf("%d%d", &vertex_num, &edge_num);
Graph* G = init_graph(vertex_num);
printf("请输入每条边的起点和终点(从0开始编号):\n");
for(int i=0; i<edge_num; i++) {
int v1, v2;
scanf("%d%d", &v1, &v2);
add_edge(G, v1, v2);
}
printf("递归DFS结果为:");
int visited[MAX_VERTEX] = {0};
for(int i=0; i<G->vertex_num; i++) {
if(!visited[i]) {
dfs_recursive(G, i, visited);
}
}
printf("\n非递归DFS结果为:");
for(int i=0; i<G->vertex_num; i++) {
visited[i] = 0;
}
for(int i=0; i<G->vertex_num; i++) {
if(!visited[i]) {
dfs_iterative(G, i, visited);
}
}
printf("\n");
return 0;
}
```
注:以上代码使用邻接矩阵表示图,可根据需要修改为邻接表或其他表示方法。
阅读全文