设无向图G有n个顶点(设顶点值用1~n编号),m条边,假设图以数组表示法存储。 编写程序,实现以下功能: (1)创建图的邻接矩阵存储结构 (2)深度优先遍历 (3)广度优先遍历 【输入形式】 顶点个数: n 边的条数:m 边的顶点对: (a,b)…… 【输出形式】 深度优先遍历结果 广度优先遍历结果,用c语言实现的完整代码
时间: 2023-12-29 12:01:56 浏览: 233
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
以下是C语言实现的完整代码,实现了创建图的邻接矩阵存储结构、深度优先遍历、广度优先遍历功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXVEX 100
// 邻接矩阵存储结构
typedef struct {
int vexs[MAXVEX]; // 存储顶点的数组
int arc[MAXVEX][MAXVEX]; // 存储边的二维数组
int vexNum; // 图中当前的顶点数
int arcNum; // 图中当前的边数
} MGraph;
// 创建无向图的邻接矩阵存储结构
void createMGraph(MGraph *G)
{
int i, j, k, v1, v2;
printf("请输入顶点个数:");
scanf("%d", &G->vexNum);
printf("请输入边的条数:");
scanf("%d", &G->arcNum);
// 初始化邻接矩阵
for (i = 0; i < G->vexNum; i++) {
for (j = 0; j < G->vexNum; j++) {
G->arc[i][j] = 0;
}
}
// 输入顶点的值
for (i = 0; i < G->vexNum; i++) {
printf("请输入第%d个顶点的值:", i + 1);
scanf("%d", &G->vexs[i]);
}
// 输入边的信息
for (k = 0; k < G->arcNum; k++) {
printf("请输入第%d条边的顶点对:", k + 1);
scanf("%d,%d", &v1, &v2);
i = j = -1;
// 找到边的两个顶点的位置
for (int m = 0; m < G->vexNum; m++) {
if (G->vexs[m] == v1) {
i = m;
}
if (G->vexs[m] == v2) {
j = m;
}
if (i != -1 && j != -1) {
break;
}
}
// 添加边
if (i != -1 && j != -1) {
G->arc[i][j] = 1;
G->arc[j][i] = 1;
}
}
}
// 深度优先遍历
void DFS(MGraph G, int v, bool visited[])
{
printf("%d ", G.vexs[v]); // 访问当前顶点
visited[v] = true; // 标记当前顶点已访问
for (int i = 0; i < G.vexNum; i++) {
if (G.arc[v][i] == 1 && !visited[i]) { // 如果存在边且未访问
DFS(G, i, visited); // 递归访问下一个顶点
}
}
}
// 深度优先遍历(非递归实现)
void DFS2(MGraph G, int v, bool visited[])
{
int stack[MAXVEX], top = -1; // 初始化栈
printf("%d ", G.vexs[v]); // 访问当前顶点
visited[v] = true; // 标记当前顶点已访问
stack[++top] = v; // 将当前顶点入栈
while (top != -1) {
int w = stack[top--]; // 弹出栈顶元素
for (int i = 0; i < G.vexNum; i++) {
if (G.arc[w][i] == 1 && !visited[i]) { // 如果存在边且未访问
printf("%d ", G.vexs[i]); // 访问下一个顶点
visited[i] = true; // 标记下一个顶点已访问
stack[++top] = i; // 将下一个顶点入栈
}
}
}
}
// 广度优先遍历
void BFS(MGraph G, int v, bool visited[])
{
int queue[MAXVEX], front = 0, rear = 0; // 初始化队列
printf("%d ", G.vexs[v]); // 访问当前顶点
visited[v] = true; // 标记当前顶点已访问
queue[rear++] = v; // 将当前顶点入队
while (front != rear) {
int w = queue[front++]; // 弹出队头元素
for (int i = 0; i < G.vexNum; i++) {
if (G.arc[w][i] == 1 && !visited[i]) { // 如果存在边且未访问
printf("%d ", G.vexs[i]); // 访问下一个顶点
visited[i] = true; // 标记下一个顶点已访问
queue[rear++] = i; // 将下一个顶点入队
}
}
}
}
int main()
{
MGraph G;
bool visited[MAXVEX] = {false}; // 初始化所有顶点均未被访问
createMGraph(&G);
printf("深度优先遍历结果:");
DFS(G, 0, visited);
printf("\n广度优先遍历结果:");
BFS(G, 0, visited);
return 0;
}
```
输入示例:
```
请输入顶点个数:5
请输入边的条数:5
请输入第1个顶点的值:1
请输入第2个顶点的值:2
请输入第3个顶点的值:3
请输入第4个顶点的值:4
请输入第5个顶点的值:5
请输入第1条边的顶点对:1,2
请输入第2条边的顶点对:1,3
请输入第3条边的顶点对:2,4
请输入第4条边的顶点对:2,5
请输入第5条边的顶点对:3,4
```
输出示例:
```
深度优先遍历结果:1 2 4 5 3
广度优先遍历结果:1 2 3 4 5
```
阅读全文