4. 广度优先搜索(BFS)
算法演示地址为:http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html
伪代码如下:
c完整代码如下:
/* bfs.c */
#include <stdio.h>
#include "queue.h"
#define N 6
struct adj_matrix {
int vertex[N];
int edge[N][N];
};
struct adj_matrix matrix = {
{1, 2, 3, 4, 5, 6},
{{0, 1, 0, 1, 0, 0},
{0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 1, 1},
{0, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 1}}
};
int visit[N] = {0, 0, 0, 0, 0, 0};
void bfs(struct adj_matrix *G)
{
int i, j;
int x;
for (i = 0; i < N; i++) {
if (visit[i] != 1) {
visit[i] = 1;
printf("%3d", G->vertex[i]);
enqueue(i);
while (!queue_empty()) {
x = dequeue();
for (j = 0; j < N; j++) {
if (G->edge[x][j] == 1 && visit[j] != 1) {
visit[j] = 1;
printf("%3d", G->vertex[j]);
enqueue(j);
}
}
}
}
}
}
int main(void)
{
bfs(&matrix);
printf("\n");
return 0;
}
其中用到了队列,队列部分代码如下:
/* queue.c */
#include <stdio.h>
#include <limits.h>
#define QUEUE_LENGTH 128
struct queue {
int head;
int tail;
int size;
int buf[QUEUE_LENGTH];
};
struct queue Q;
int queue_empty(void)
{
return Q.size == 0;
}
int queue_full(void)
{
return Q.size == QUEUE_LENGTH;
}
int dequeue(void)
{
int x;
if (queue_empty()) {
printf("Queue underflow!\n");
return INT_MIN;
}
x = Q.buf[Q.head];
Q.size--;
if (Q.head == QUEUE_LENGTH - 1) {
Q.head = 0;
} else {
Q.head++;
}
return x;
}
void enqueue(int x)
{
if (queue_full()) {
printf("Queue overflow!\n");
return;
}
Q.buf[Q.tail] = x;
Q.size++;
if (Q.tail == QUEUE_LENGTH - 1) {
Q.tail = 0;
} else {
Q.tail++;
}
}
头文件为:
/* queue.h */
#ifndef __QUEUE_H
#define __QUEUE_H
/* Queue API */
void enqueue(int x);
int dequeue(void);
int queue_empty(void);
int queue_full(void);
#endif /* __QUEUE_H */
遍历结果为: 1 2 4 5 3 6