以下是C语言实现邻接矩阵图的深度优先遍历和广度优先遍历的代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 20 // 最大顶点数
#define QUEUE_SIZE 50 // 队列大小

// 图的邻接矩阵存储结构
typedef struct {
    int vertices[MAX_VERTEX_NUM]; // 顶点集合
    int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 边集合
    int vertex_num; // 顶点数
    int edge_num; // 边数
} Graph;

// 初始化图
void initGraph(Graph *graph) {
    int i, j;
    graph->vertex_num = 0;
    graph->edge_num = 0;
    for (i = 0; i < MAX_VERTEX_NUM; i++) {
        graph->vertices[i] = 0;
        for (j = 0; j < MAX_VERTEX_NUM; j++) {
            graph->edges[i][j] = 0;
        }
    }
}

// 增加顶点
void addVertex(Graph *graph, int vertex) {
    graph->vertices[graph->vertex_num++] = vertex;
}

// 增加边
void addEdge(Graph *graph, int start, int end) {
    graph->edges[start][end] = 1;
    graph->edge_num++;
}

// 深度优先遍历
void DFS(Graph *graph, int vertex, int visited[]) {
    int i;
    visited[vertex] = 1;
    printf("%d ", graph->vertices[vertex]);
    for (i = 0; i < graph->vertex_num; i++) {
        if (graph->edges[vertex][i] && !visited[i]) {
            DFS(graph, i, visited);
        }
    }
}

// 广度优先遍历
void BFS(Graph *graph, int vertex, int visited[]) {
    int i, front = 0, rear = 0;
    int queue[QUEUE_SIZE];
    visited[vertex] = 1;
    printf("%d ", graph->vertices[vertex]);
    queue[rear++] = vertex;
    while (front != rear) {
        int v = queue[front++];
        for (i = 0; i < graph->vertex_num; i++) {
            if (graph->edges[v][i] && !visited[i]) {
                visited[i] = 1;
                printf("%d ", graph->vertices[i]);
                queue[rear++] = i;
            }
        }
    }
}

int main() {
    Graph graph;
    int i, j, visited[MAX_VERTEX_NUM] = {0};
    initGraph(&graph);
    printf("请输入顶点数和边数:");
    scanf("%d%d", &graph.vertex_num, &graph.edge_num);
    for (i = 0; i < graph.vertex_num; i++) {
        printf("请输入第%d个顶点:", i + 1);
        scanf("%d", &graph.vertices[i]);
    }
    for (i = 0; i < graph.edge_num; i++) {
        int start, end;
        printf("请输入第%d条边的起点和终点:", i + 1);
        scanf("%d%d", &start, &end);
        addEdge(&graph, start, end);
        addEdge(&graph, end, start); // 无向图要加上这一行
    }
    printf("邻接矩阵为:\n");
    for (i = 0; i < graph.vertex_num; i++) {
        for (j = 0; j < graph.vertex_num; j++) {
            printf("%d ", graph.edges[i][j]);
        }
        printf("\n");
    }
    printf("深度优先遍历结果为:");
    for (i = 0; i < graph.vertex_num; i++) {
        if (!visited[i]) {
            DFS(&graph, i, visited);
        }
    }
    printf("\n");
    for (i = 0; i < graph.vertex_num; i++) {
        visited[i] = 0;
    }
    printf("广度优先遍历结果为:");
    for (i = 0; i < graph.vertex_num; i++) {
        if (!visited[i]) {
            BFS(&graph, i, visited);
        }
    }
    printf("\n");
    return 0;
}

该代码先定义了一个图的结构体,其中包含了顶点集合、边集合、顶点数和边数等信息,以及初始化图、增加顶点和增加边等操作。然后使用输入来创建邻接矩阵图,并输出邻接矩阵。最后分别使用深度优先遍历和广度优先遍历来遍历图,并输出遍历结果。在广度优先遍历中使用了一个队列来存储已经遍历过的顶点,以便进行下一层的遍历


原文地址: http://www.cveoy.top/t/topic/fsDH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录