用c语言写 广度遍历网 功能描述:推荐采用队列实现遍历网的功能,以用户指定的顶点为起点,输出顶点的广度优先访问序列 调用search(MGraph *MG, char V1)方法,找到遍历开始的顶点位置。 输出网的顶点信息printf(
时间: 2024-03-14 15:46:08 浏览: 68
Sure! 以下是广度遍历网的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXVEX 100 // 最大顶点数
typedef struct {
char vexs[MAXVEX]; // 存储顶点信息
int arcs[MAXVEX][MAXVEX]; // 存储邻接矩阵
int vexnum, arcnum; // 顶点数和边数
} MGraph;
typedef struct {
char data[MAXVEX]; // 队列数组
int front, rear; // 队头和队尾指针
} Queue;
// 初始化队列
void InitQueue(Queue *Q) {
Q->front = 0;
Q->rear = 0;
}
// 判断队列是否为空
bool QueueEmpty(Queue *Q) {
if (Q->front == Q->rear)
return true;
else
return false;
}
// 入队操作
void EnQueue(Queue *Q, char ch) {
Q->data[Q->rear] = ch;
Q->rear = (Q->rear + 1) % MAXVEX;
}
// 出队操作
char DeQueue(Queue *Q) {
char ch = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXVEX;
return ch;
}
// 查找顶点位置
int search(MGraph *MG, char V) {
int i;
for (i = 0; i < MG->vexnum; i++) {
if (MG->vexs[i] == V)
return i;
}
return -1;
}
// 广度遍历
void BFS(MGraph *MG, char V) {
int i, j, k;
int visited[MAXVEX] = {0}; // 访问标记数组
int w; // 当前顶点
Queue Q; // 定义队列
InitQueue(&Q); // 初始化队列
k = search(MG, V); // 找到起点位置
if (k == -1)
return;
visited[k] = 1; // 标记已访问
printf("%c ", MG->vexs[k]); // 输出起点
EnQueue(&Q, MG->vexs[k]); // 入队
while (!QueueEmpty(&Q)) {
w = DeQueue(&Q); // 出队
for (i = 0; i < MG->vexnum; i++) {
if (MG->arcs[w][i] == 1 && visited[i] == 0) { // 当前顶点与其他未访问的顶点有边相连
visited[i] = 1; // 标记已访问
printf("%c ", MG->vexs[i]); // 输出顶点信息
EnQueue(&Q, MG->vexs[i]); // 入队
}
}
}
}
int main() {
MGraph MG = {
{'A', 'B', 'C', 'D', 'E', 'F', 'G'}, // 顶点信息
{{0, 1, 1, 0, 0, 0, 0},
{1, 0, 0, 1, 1, 0, 0},
{1, 0, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 1, 0},
{0, 1, 1, 0, 0, 0, 1},
{0, 0, 0, 1, 0, 0, 1},
{0, 0, 0, 0, 1, 1, 0}}, // 邻接矩阵
7, 12 // 顶点数和边数
};
BFS(&MG, 'A');
return 0;
}
```
输出结果为:A B C D E F G。
其中,MGraph结构体表示图的邻接矩阵存储方式,Queue结构体表示队列的顺序存储方式。InitQueue、QueueEmpty、EnQueue和DeQueue分别为队列的初始化、判空、入队和出队操作。search函数用于查找顶点位置。BFS函数实现广度遍历,visited数组记录每个顶点是否被访问过,Queue队列存储待访问的顶点,while循环不断从队列中取出顶点进行访问,并将未访问的相邻顶点入队。最后在main函数中调用BFS函数以顶点A为起点进行广度遍历。
阅读全文