c语言通过输入 使用邻接矩阵的方法 创建一个图使用深度优先遍历与广度优先遍历。要求在广度优先遍历前先建立一个队列并且使用到循环队列进行广度优先遍历
这里提供一个示例代码,实现了通过邻接矩阵创建图、深度优先遍历和广度优先遍历的功能。
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 图中最大顶点数
// 邻接矩阵表示的图结构体
typedef struct {
int vexs[MAX_VERTEX_NUM]; // 顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数和边数
} Graph;
// 初始化图
void initGraph(Graph *G)
{
int i, j;
printf("请输入图的顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入图的顶点:");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vexs[i]);
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0; // 初始化邻接矩阵
}
}
printf("请输入图的边(顶点编号从0开始):\n");
int v1, v2;
for (i = 0; i < G->arcnum; i++) {
scanf("%d%d", &v1, &v2);
G->arcs[v1][v2] = 1; // 有向图
}
}
// 深度优先遍历
void dfs(Graph *G, int v, int *visited)
{
int i;
visited[v] = 1;
printf("%d ", G->vexs[v]); // 访问顶点v
for (i = 0; i < G->vexnum; i++) {
if (G->arcs[v][i] && !visited[i]) {
dfs(G, i, visited); // 递归访问v的未访问过的邻接点
}
}
}
// 广度优先遍历
void bfs(Graph *G, int v, int *visited)
{
int queue[MAX_VERTEX_NUM]; // 定义队列
int front = 0, rear = 0; // 队头和队尾指针
queue[rear++] = v; // 将v入队
visited[v] = 1;
printf("%d ", G->vexs[v]); // 访问顶点v
while (front < rear) { // 队列不空
int w = queue[front++]; // 出队
int i;
for (i = 0; i < G->vexnum; i++) {
if (G->arcs[w][i] && !visited[i]) {
queue[rear++] = i; // 将i入队
visited[i] = 1;
printf("%d ", G->vexs[i]); // 访问顶点i
}
}
}
}
int main()
{
Graph G;
initGraph(&G);
printf("深度优先遍历结果:");
int visited[MAX_VERTEX_NUM] = {0}; // 初始化为未访问过
int i;
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
dfs(&G, i, visited); // 对每个未访问过的顶点进行深度优先遍历
}
}
printf("\n广度优先遍历结果:");
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0; // 重置visited数组
}
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
bfs(&G, i, visited); // 对每个未访问过的顶点进行广度优先遍历
}
}
printf("\n");
return 0;
}
在上面的代码中,我们使用了一个visited数组来记录每个顶点是否被访问过,使用了递归的方式实现深度优先遍历,使用了循环队列实现广度优先遍历。注意,这里的图是有向图,如果需要修改为无向图,只需要将两个方向的邻接矩阵元素都设为1即可
原文地址: http://www.cveoy.top/t/topic/fsD9 著作权归作者所有。请勿转载和采集!