用c语言编写一个程序实现图的两种遍历算法,并在此基 础上设计一个主程序完成如下功能: (1)输出如图1所示的有向图G从项点V1开始的深度优先遊历序列。 (2)输出如图1所示的有向图G从顶点V1开始的广度优先遍历序列。图一的信息如下:v1指向v2,v4权值分别为5和7。v2指向v3,权值为4。v3指向v1,v6,权值分别为8和9。v4指向v3和v6,权值分别为5和6。v5指向v4,权值为5。v6指向v1,v5,权值分别为3和1
时间: 2024-02-09 14:13:27 浏览: 24
好的,我会根据您的要求进行回答。首先,深度优先遍历(DFS)和广度优先遍历(BFS)是图遍历中两种常用的算法。下面是用C语言实现DFS和BFS的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 6 // 最大顶点数
int visited[MAX_VERTEX_NUM] = {0}; // 记录顶点是否被访问过
// 定义邻接矩阵存储图的结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 顶点数组
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertex_num, edge_num; // 顶点数和边数
} Graph;
// 初始化图
void InitGraph(Graph *G) {
G->vertex_num = 6;
G->edge_num = 8;
int i, j;
for (i = 0; i < G->vertex_num; i++) {
G->vertex[i] = i + 1;
for (j = 0; j < G->vertex_num; j++) {
G->edge[i][j] = 0;
}
}
G->edge[0][1] = 1; // v1 -> v2
G->edge[1][2] = 1; // v2 -> v3
G->edge[2][0] = 1; // v3 -> v1
G->edge[2][3] = 1; // v3 -> v4
G->edge[2][5] = 1; // v3 -> v6
G->edge[3][5] = 1; // v4 -> v6
G->edge[3][2] = 1; // v4 -> v3
G->edge[4][3] = 1; // v5 -> v4
G->edge[5][0] = 1; // v6 -> v1
G->edge[5][4] = 1; // v6 -> v5
}
// DFS递归遍历
void DFS(Graph G, int v) {
visited[v] = 1; // 标记当前顶点已被访问
printf("%d ", G.vertex[v]); // 输出当前顶点
int i;
for (i = 0; i < G.vertex_num; i++) {
if (G.edge[v][i] == 1 && visited[i] == 0) { // 如果当前顶点与未访问的相邻顶点有边,则递归访问
DFS(G, i);
}
}
}
// BFS遍历
void BFS(Graph G, int v) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0; // 定义队列
visited[v] = 1; // 标记当前顶点已被访问
printf("%d ", G.vertex[v]); // 输出当前顶点
queue[rear++] = v; // 将当前顶点入队
while (front != rear) { // 队列不为空时循环
int w = queue[front++]; // 取出队首顶点
int i;
for (i = 0; i < G.vertex_num; i++) {
if (G.edge[w][i] == 1 && visited[i] == 0) { // 如果当前顶点与未访问的相邻顶点有边,则标记已访问并入队
visited[i] = 1;
printf("%d ", G.vertex[i]);
queue[rear++] = i;
}
}
}
}
int main() {
Graph G;
InitGraph(&G);
printf("DFS: ");
DFS(G, 0);
printf("\nBFS: ");
int i;
for (i = 0; i < MAX_VERTEX_NUM; i++) { // BFS需要清空visited数组
visited[i] = 0;
}
BFS(G, 0);
printf("\n");
return 0;
}
```
上面的代码中,我们首先定义了一个邻接矩阵存储图的结构体,并初始化了一个有向图G。然后,我们分别实现了DFS和BFS遍历算法,其中DFS使用递归方式实现,BFS使用队列方式实现。最后,在主函数中调用DFS和BFS函数即可输出遍历结果。