用C语言写一个图的广度优先遍历函数
时间: 2023-05-28 14:06:20 浏览: 90
广度优先遍历图C语言程序
4星 · 用户满意度95%
假设图的存储结构为邻接表,其中顶点编号为0到V-1,V为顶点数。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 最大顶点数
typedef struct node {
int vertex; // 邻接点的编号
struct node* next; // 指向下一个邻接点的指针
} Node;
typedef struct {
Node* head; // 指向邻接表的头指针
} Vertex;
Vertex graph[MAX_VERTICES]; // 图的邻接表表示
int visited[MAX_VERTICES]; // 标记已经访问的顶点
// 添加一条边
void addEdge(int u, int v)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = graph[u].head;
graph[u].head = newNode;
}
// 广度优先遍历
void bfs(int start)
{
int queue[MAX_VERTICES]; // 队列
int front = 0, rear = 0; // 队头和队尾指针
// 将起点加入队列
queue[rear++] = start;
visited[start] = 1;
while (front < rear) {
int u = queue[front++]; // 取出队头顶点
printf("%d ", u); // 访问顶点
// 遍历邻接点
Node* p = graph[u].head;
while (p != NULL) {
int v = p->vertex;
if (!visited[v]) { // 如果邻接点未被访问,加入队列
queue[rear++] = v;
visited[v] = 1;
}
p = p->next;
}
}
}
int main()
{
int V, E; // 顶点数和边数
scanf("%d%d", &V, &E);
// 初始化邻接表
for (int i = 0; i < V; i++) {
graph[i].head = NULL;
visited[i] = 0;
}
// 添加边
for (int i = 0; i < E; i++) {
int u, v;
scanf("%d%d", &u, &v);
addEdge(u, v);
addEdge(v, u); // 如果是无向图,需要添加反向边
}
// 从顶点0开始遍历
bfs(0);
return 0;
}
```
阅读全文