c语言通过输入 使用邻接矩阵的方法 创建一个图使用深度优先遍历与广度优先遍历。要求使用广度优先遍历时要先建立一个队列并且使用到循环队列
以下是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 著作权归作者所有。请勿转载和采集!