使用c语言编写一个程序,使用深度优先遍历图然后输出深度优先遍历生成树,输出方法为括号表示法
时间: 2024-12-17 10:19:06 浏览: 10
这是自学C语言编写的常用50个算法的代码,自用
在C语言中,我们可以使用递归函数来实现深度优先遍历(Depth First Search, DFS)并生成树的括号表示法。首先,我们需要创建一个邻接表或者其他数据结构来存储图的节点及其连接。这里我们假设图是一个邻接数组表示。
下面是一个简单的示例:
```c
#include <stdio.h>
#include <stdbool.h>
// 图的节点定义
typedef struct Node {
int data;
bool visited; // 标记是否已访问
struct Node* next; // 指向下一个邻居
} Node;
// 创建邻接列表表示的图
void create_graph(Node** graph, int n, int edges[], int src[]) {
for (int i = 0; i < n; i++) {
graph[i] = NULL;
}
for (int i = 0; i < n - 1; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = src[i];
newNode->next = graph[src[i]];
graph[src[i]] = newNode;
edges[i] = src[i + 1];
}
}
// 深度优先遍历并打印括号表示法
void dfs(Node* node, char* result, int level) {
if (node == NULL) return;
if (!node->visited) {
node->visited = true;
result[level * 2] = '(';
dfs(node->next, result, level + 1);
result[level * 2 + 1] = ')';
dfs(node, result, level);
}
}
// 主函数
int main() {
int n, m; // 分别表示节点数和边数
printf("Enter number of vertices: ");
scanf("%d", &n);
Node** graph = (Node**)malloc(n * sizeof(Node*));
int edges[n - 1], src[n]; // 边和起点数组
// 输入边的信息
create_graph(graph, n, edges, src);
char result[4 * n]; // 预留足够的空间存储结果
memset(result, '\0', sizeof(result));
dfs(graph[0], result, 0); // 从第一个节点开始
printf("DFS generated tree in parentheses: %s\n", result);
free(graph);
return 0;
}
```
在这个示例中,用户需要输入节点数、边的数量以及每条边的起点,然后程序会执行深度优先遍历,并将生成的树以括号表示法的形式打印出来。
阅读全文