用c语言写 广度遍历网 功能描述:推荐采用队列实现遍历网的功能,以用户指定的顶点为起点,输出顶点的广度优先访问序列 调用search(MGraph *MG, char V1)方法,找到遍历开始的顶点位置。 输出网的顶点信息printf("%c ", // 顶点信息); 参数说明:MG-MGraph型参数 返回值说明:无
时间: 2024-03-14 09:44:22 浏览: 63
好的,我会按照您的要求回答问题。以下是用C语言实现广度遍历网的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
typedef char VertexType; // 顶点类型
typedef int EdgeType; // 边权值类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 顶点表
EdgeType arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 当前顶点数和边数
} MGraph;
typedef struct {
int front, rear;
int data[MAX_VERTEX_NUM];
} Queue;
void InitQueue(Queue *Q) {
Q->front = Q->rear = -1;
}
bool IsEmpty(Queue *Q) {
return Q->front == Q->rear;
}
bool IsFull(Queue *Q) {
return Q->rear == MAX_VERTEX_NUM - 1;
}
bool EnQueue(Queue *Q, int x) {
if (IsFull(Q)) return false;
Q->data[++Q->rear] = x;
return true;
}
bool DeQueue(Queue *Q, int *x) {
if (IsEmpty(Q)) return false;
*x = Q->data[++Q->front];
return true;
}
int LocateVex(MGraph *MG, char V) {
for (int i = 0; i < MG->vexnum; i++) {
if (MG->vexs[i] == V) {
return i;
}
}
return -1; // 没找到
}
void CreateMGraph(MGraph *MG) {
printf("请输入顶点数和边数:");
scanf("%d %d", &MG->vexnum, &MG->arcnum);
getchar();
printf("请输入顶点信息:");
for (int i = 0; i < MG->vexnum; i++) {
scanf("%c", &MG->vexs[i]);
getchar();
}
for (int i = 0; i < MG->vexnum; i++) {
for (int j = 0; j < MG->vexnum; j++) {
MG->arc[i][j] = 0;
}
}
printf("请输入边信息:");
for (int k = 0; k < MG->arcnum; k++) {
VertexType V1, V2;
printf("请输入第%d条边的两个顶点:", k + 1);
scanf("%c %c", &V1, &V2);
getchar();
int i = LocateVex(MG, V1);
int j = LocateVex(MG, V2);
printf("请输入第%d条边的权值:", k + 1);
scanf("%d", &MG->arc[i][j]);
MG->arc[j][i] = MG->arc[i][j]; // 无向图
}
}
void BFS(MGraph *MG, int v, bool visited[]) {
Queue Q;
InitQueue(&Q);
visited[v] = true;
printf("%c ", MG->vexs[v]);
EnQueue(&Q, v);
while (!IsEmpty(&Q)) {
int u;
DeQueue(&Q, &u);
for (int w = 0; w < MG->vexnum; w++) {
if (MG->arc[u][w] != 0 && !visited[w]) {
visited[w] = true;
printf("%c ", MG->vexs[w]);
EnQueue(&Q, w);
}
}
}
}
void BFSTraverse(MGraph *MG) {
bool visited[MAX_VERTEX_NUM];
for (int i = 0; i < MG->vexnum; i++) {
visited[i] = false;
}
for (int i = 0; i < MG->vexnum; i++) {
if (!visited[i]) {
BFS(MG, i, visited);
}
}
}
int main() {
MGraph MG;
CreateMGraph(&MG);
printf("广度优先遍历:");
BFSTraverse(&MG);
printf("\n");
return 0;
}
```
在这个代码中,我们通过邻接矩阵来存储图,使用队列实现了广度优先遍历,并输出了遍历顺序。其中,`LocateVex`函数用于定位顶点在顶点表中的位置,`CreateMGraph`函数用于创建图,`BFSTraverse`函数用于遍历整张图,`BFS`函数用于遍历单个连通分量。
阅读全文