邻接表的广度优先遍历c
时间: 2023-12-19 13:31:56 浏览: 69
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MaxVertexNum 100
typedef int Vertex; // 顶点下标用整数表示
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode {
Vertex AdjV; // 邻接点下标
PtrToAdjVNode Next; // 指向下一个邻接点的指针
};
typedef struct Vnode {
PtrToAdjVNode FirstEdge; // 边表头指针
} AdjList[MaxVertexNum];
typedef struct GNode *PtrToGNode;
struct GNode {
int Nv; // 顶点数
int Ne; // 边数
AdjList G; // 邻接表
};
typedef PtrToGNode LGraph; // 以邻接表方式存储的图类型
void BFS(LGraph Graph, Vertex S, void (*Visit)(Vertex));
void Visit(Vertex V) {
printf("%d ", V);
}
void BFS(LGraph Graph, Vertex S, void (*Visit)(Vertex)) {
bool Visited[MaxVertexNum] = {false}; // 访问标记数组
int Queue[MaxVertexNum]; // 队列
int front = 0, rear = 0; // 队列头尾指针
PtrToAdjVNode W;
Visit(S); // 访问起始顶点S
Visited[S] = true; // 标记S已访问
Queue[rear++] = S; // 入队S
while (front < rear) {
Vertex V = Queue[front++]; // 出队
for (W = Graph->G[V].FirstEdge; W; W = W->Next) {
if (!Visited[W->AdjV]) {
Visit(W->AdjV); // 访问顶点W->AdjV
Visited[W->AdjV] = true; // 标记W->AdjV已访问
Queue[rear++] = W->AdjV; // W->AdjV入队
}
}
}
}
```
阅读全文