用C语言写一个用户输入有向图邻接矩阵,输出该有向图的两种遍历方式
时间: 2024-03-20 15:38:57 浏览: 80
有向图的邻接表遍历(c语言)
4星 · 用户满意度95%
好的,我可以为您提供一个用C语言编写的程序,用于用户输入有向图的邻接矩阵,并输出该有向图的两种遍历方式(深度优先遍历和广度优先遍历)。
以下是程序代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 定义最大顶点数
// 定义邻接矩阵结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 顶点数组
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵数组
int vexnum, arcnum; // 顶点数和边数
} Graph;
// 初始化邻接矩阵
void initGraph(Graph *g) {
int i, j;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
g->vertex[i] = 0;
for (j = 0; j < MAX_VERTEX_NUM; j++) {
g->arc[i][j] = 0;
}
}
g->vexnum = 0;
g->arcnum = 0;
}
// 添加顶点
void addVertex(Graph *g, int v) {
g->vertex[g->vexnum++] = v;
}
// 添加边
void addArc(Graph *g, int v1, int v2) {
int i, j;
for (i = 0; i < g->vexnum; i++) {
if (g->vertex[i] == v1) {
break;
}
}
for (j = 0; j < g->vexnum; j++) {
if (g->vertex[j] == v2) {
break;
}
}
g->arc[i][j] = 1;
g->arcnum++;
}
// 深度优先遍历
void DFS(Graph *g, int v, int *visited) {
int i;
visited[v] = 1;
printf("%d ", g->vertex[v]);
for (i = 0; i < g->vexnum; i++) {
if (!visited[i] && g->arc[v][i] == 1) {
DFS(g, i, visited);
}
}
}
// 广度优先遍历
void BFS(Graph *g, int v, int *visited) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
int i, j;
visited[v] = 1;
printf("%d ", g->vertex[v]);
queue[rear++] = v;
while (front < rear) {
i = queue[front++];
for (j = 0; j < g->vexnum; j++) {
if (!visited[j] && g->arc[i][j] == 1) {
visited[j] = 1;
printf("%d ", g->vertex[j]);
queue[rear++] = j;
}
}
}
}
int main() {
Graph g;
int visited[MAX_VERTEX_NUM] = {0}; // 用于记录顶点是否被访问过
int i, j;
int v1, v2;
// 初始化邻接矩阵
initGraph(&g);
// 添加顶点
printf("请输入顶点数量:");
scanf("%d", &g.vexnum);
printf("请输入各个顶点:");
for (i = 0; i < g.vexnum; i++) {
scanf("%d", &g.vertex[i]);
}
// 添加边
printf("请输入边数量:");
scanf("%d", &g.arcnum);
printf("请输入各个边(v1 v2):");
for (i = 0; i < g.arcnum; i++) {
scanf("%d %d", &v1, &v2);
addArc(&g, v1, v2);
}
// 输出邻接矩阵
printf("邻接矩阵为:\n");
for (i = 0; i < g.vexnum; i++) {
for (j = 0; j < g.vexnum; j++) {
printf("%d ", g.arc[i][j]);
}
printf("\n");
}
// 深度优先遍历
printf("深度优先遍历结果为:");
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;
}
printf("广度优先遍历结果为:");
for (i = 0; i < g.vexnum; i++) {
if (!visited[i]) {
BFS(&g, i, visited);
}
}
printf("\n");
return 0;
}
```
程序中,我们首先定义了一个邻接矩阵结构体,包括顶点数组、邻接矩阵数组、顶点数和边数。然后,我们通过 addVertex 函数和 addArc 函数分别实现了添加顶点和添加边的功能。
接着,我们实现了深度优先遍历和广度优先遍历的函数,这两个函数都是递归函数,其中 DFS 函数用于深度优先遍历,BFS 函数用于广度优先遍历。
最后,我们在 main 函数中,通过用户输入顶点和边的信息,构建了一个有向图的邻接矩阵,并输出了该有向图的两种遍历方式。
阅读全文