bfs算法有向图c语言
时间: 2023-07-26 16:11:55 浏览: 88
BFS-ADJ-LIST-MAZE,选课系统源码c语言,c语言
以下是BFS算法在C语言中的有向图实现:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
// 队列结构体
struct Queue {
int items[MAX];
int front;
int rear;
};
// 创建队列
struct Queue* createQueue() {
struct Queue* q = malloc(sizeof(struct Queue));
q->front = -1;
q->rear = -1;
return q;
}
// 判断队列是否为空
int isEmpty(struct Queue* q) {
if(q->rear == -1)
return 1;
else
return 0;
}
// 入队
void enqueue(struct Queue* q, int value) {
if(q->rear == MAX-1)
printf("队列已满!\n");
else {
if(q->front == -1)
q->front = 0;
q->rear++;
q->items[q->rear] = value;
}
}
// 出队
int dequeue(struct Queue* q) {
int item;
if(isEmpty(q)) {
printf("队列为空!\n");
item = -1;
}
else {
item = q->items[q->front];
q->front++;
if(q->front > q->rear) {
q->front = q->rear = -1;
}
}
return item;
}
// 初始化图
void initGraph(int graph[][MAX], int n) {
int i, j;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
graph[i][j] = 0;
}
}
}
// 添加边
void addEdge(int graph[][MAX], int u, int v) {
graph[u][v] = 1;
}
// BFS算法
void bfs(int graph[][MAX], int start, int n) {
// 初始化visited数组
int visited[MAX] = {0};
// 创建队列
struct Queue* q = createQueue();
// 标记起点为已访问并入队
visited[start] = 1;
enqueue(q, start);
// 输出遍历结果
printf("BFS遍历结果: ");
while(!isEmpty(q)) {
int currentNode = dequeue(q);
printf("%d ", currentNode);
// 遍历当前节点的邻居节点
int i;
for(i=0; i<n; i++) {
if(graph[currentNode][i] == 1 && visited[i] == 0) {
visited[i] = 1;
enqueue(q, i);
}
}
}
}
int main() {
int n; // 顶点数
int graph[MAX][MAX]; // 邻接矩阵
// 初始化图
printf("请输入顶点数:");
scanf("%d", &n);
initGraph(graph, n);
// 添加边
int u, v;
printf("请输入边(-1结束):\n");
while(1) {
scanf("%d%d", &u, &v);
if(u == -1 || v == -1) {
break;
}
else {
addEdge(graph, u, v);
}
}
// BFS遍历
int start;
printf("请输入起点:");
scanf("%d", &start);
bfs(graph, start, n);
return 0;
}
```
以上代码中,`graph`数组为邻接矩阵,`createQueue()`函数用于创建队列,`enqueue()`函数用于入队,`dequeue()`函数用于出队,`initGraph()`函数用于初始化图,`addEdge()`函数用于添加边,`bfs()`函数为BFS算法实现。
阅读全文