设无向图G有n个顶点(设顶点值用1~n编号),m条边,假设图以数组表示法存储。 编写程序,实现以下功能: (1)创建图的邻接矩阵存储结构 (2)深度优先遍历 (3)广度优先遍历 【输入形式】 顶点个数: n 边的条数:m 边的顶点对: (a,b)…… 【输出形式】 深度优先遍历结果 广度优先遍历结果 【样例输入】 5 4 1 2 1 3 2 4 3 5 【样例输出】 1 2 4 3 5 1 2 3 4 5。用c语言实现的完整代码
时间: 2024-02-13 07:05:27 浏览: 56
以下是用C语言实现的完整代码,包含了创建邻接矩阵、深度优先遍历和广度优先遍历等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 定义邻接矩阵存储结构
typedef struct {
int edges[MAX_SIZE][MAX_SIZE]; // 存储边的矩阵
int n; // 顶点数
int e; // 边数
} Graph;
// 深度优先遍历
void DFS(Graph g, int v, bool visited[]) {
visited[v] = true;
printf("%d ", v+1); // 输出顶点编号
for(int i=0; i<g.n; i++) {
if(g.edges[v][i] == 1 && !visited[i]) {
DFS(g, i, visited); // 递归遍历相邻未访问的顶点
}
}
}
// 广度优先遍历
void BFS(Graph g, int v, bool visited[]) {
int queue[MAX_SIZE];
int front = 0, rear = 0;
queue[rear++] = v;
visited[v] = true;
while(front < rear) {
int cur = queue[front++];
printf("%d ", cur+1); // 输出顶点编号
for(int i=0; i<g.n; i++) {
if(g.edges[cur][i] == 1 && !visited[i]) {
visited[i] = true;
queue[rear++] = i; // 将相邻未访问的顶点入队
}
}
}
}
int main() {
Graph g;
bool visited[MAX_SIZE] = {false}; // 初始化为未访问
int n, m;
printf("请输入顶点个数和边数(用空格分隔):\n");
scanf("%d %d", &n, &m);
g.n = n;
g.e = m;
// 初始化邻接矩阵
for(int i=0; i<g.n; i++) {
for(int j=0; j<g.n; j++) {
g.edges[i][j] = 0;
}
}
// 读入边的信息
printf("请输入边的信息(两个顶点用空格分隔):\n");
for(int i=0; i<g.e; i++) {
int a, b;
scanf("%d %d", &a, &b);
g.edges[a-1][b-1] = g.edges[b-1][a-1] = 1; // 无向图需要对称
}
// 深度优先遍历
printf("深度优先遍历结果:\n");
for(int i=0; i<g.n; i++) {
if(!visited[i]) {
DFS(g, i, visited);
}
}
printf("\n");
// 广度优先遍历
for(int i=0; i<g.n; i++) {
visited[i] = false; // 重置visited数组
}
printf("广度优先遍历结果:\n");
for(int i=0; i<g.n; i++) {
if(!visited[i]) {
BFS(g, i, visited);
}
}
printf("\n");
return 0;
}
```
注意,顶点编号从1开始,但在程序中需要减1转换为数组下标。另外,由于是无向图,因此需要对称存储边的信息。
阅读全文