创建最大结点树为30的任意图,实现对无向图的两种遍历,用c语言完成
时间: 2024-03-10 20:47:21 浏览: 21
好的,让我们来创建一个最大结点树为30的无向图。由于C语言没有现成的图数据结构,我们可以使用邻接矩阵来表示这个图。以下是创建该图的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_NODES 30
int graph[MAX_NODES][MAX_NODES];
void generate_random_graph() {
// 初始化邻接矩阵
for (int i = 0; i < MAX_NODES; i++) {
for (int j = 0; j < MAX_NODES; j++) {
graph[i][j] = 0;
}
}
// 随机连接结点
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX_NODES; i++) {
// 每个结点最多连接5个邻居
int num_neighbors = rand() % 5 + 1;
for (int j = 0; j < num_neighbors; j++) {
int neighbor = rand() % MAX_NODES;
if (neighbor != i) {
graph[i][neighbor] = 1;
graph[neighbor][i] = 1;
}
}
}
}
```
这个函数使用邻接矩阵来表示图。对于每个结点,它随机连接1到5个邻居结点。
接下来是深度优先遍历(DFS)的C语言实现:
```c
void dfs(int node, int visited[]) {
visited[node] = 1;
printf("%d ", node);
for (int i = 0; i < MAX_NODES; i++) {
if (graph[node][i] == 1 && visited[i] == 0) {
dfs(i, visited);
}
}
}
void dfs_traversal() {
int visited[MAX_NODES] = {0};
// 遍历每个结点
for (int i = 0; i < MAX_NODES; i++) {
if (visited[i] == 0) {
dfs(i, visited);
}
}
}
```
这个函数使用递归方式实现深度优先遍历。我们需要使用一个visited数组来记录哪些结点已经被访问过了。遍历每个结点时,如果该结点没有被访问过,则从该结点开始进行DFS遍历。
下面是广度优先遍历(BFS)的C语言实现:
```c
void bfs_traversal() {
int visited[MAX_NODES] = {0};
int queue[MAX_NODES];
int front = 0, rear = 0;
// 遍历每个结点
for (int i = 0; i < MAX_NODES; i++) {
if (visited[i] == 0) {
visited[i] = 1;
printf("%d ", i);
queue[rear++] = i;
while (front != rear) {
int node = queue[front++];
for (int j = 0; j < MAX_NODES; j++) {
if (graph[node][j] == 1 && visited[j] == 0) {
visited[j] = 1;
printf("%d ", j);
queue[rear++] = j;
}
}
}
}
}
}
```
这个函数使用队列实现广度优先遍历。在遍历每个结点时,我们使用一个queue数组来存储已经访问的结点,然后依次访问每个结点的邻居结点,并将其加入队列中。当队列为空时,遍历完成。
您可以尝试使用这些函数来遍历上面生成的图。