广度优先搜索c语言代码
时间: 2023-06-08 22:04:41 浏览: 130
以下是广度优先搜索的C语言代码:
```
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 // 定义队列中元素的最大数量
typedef struct {
int data[MAXSIZE]; // 存放队列元素
int front; // 存放队头元素位置
int rear; // 存放队尾元素位置
}Queue;
void InitQueue(Queue *Q){ // 初始化队列
Q->front = Q->rear = 0;
}
int IsEmpty(Queue *Q){ // 判断队列是否为空
if(Q->front == Q->rear){
return 1;
}
return 0;
}
int IsFull(Queue *Q){ // 判断队列是否已满
if(Q->rear == MAXSIZE){
return 1;
}
return 0;
}
void EnQueue(Queue *Q, int e){ // 入队
if(IsFull(Q)){
printf("队列已满,无法入队\n");
return;
}
Q->data[Q->rear] = e;
Q->rear++;
}
int DeQueue(Queue *Q){ // 出队
if(IsEmpty(Q)){
printf("队列为空,无法出队\n");
return -1;
}
int e = Q->data[Q->front];
Q->front++;
return e;
}
void BFS(int G[][7], int v, int n){ // 广度优先搜索
Queue Q;
InitQueue(&Q);
int visited[7] = {0}; // visited数组记录顶点是否被访问过
printf("%d ", v); // 输出起始顶点
visited[v] = 1; // 标记起始顶点已访问过
EnQueue(&Q, v); // 起始顶点入队
while(!IsEmpty(&Q)){
int u = DeQueue(&Q); // 出队
for(int i = 1; i <= n; i++){
if(G[u][i] == 1 && visited[i] == 0){ // 如果顶点i与顶点u有边相连,且顶点i未被访问过
printf("%d ", i); // 输出顶点i
visited[i] = 1; // 标记顶点i已访问过
EnQueue(&Q, i); // 顶点i入队
}
}
}
}
int main(){
int G[7][7] = {
{0,0,0,0,0,0,0},
{0,0,1,1,0,0,0},
{0,1,0,0,1,0,0},
{0,1,0,0,1,0,0},
{0,0,1,1,0,1,1},
{0,0,0,0,1,0,0},
{0,0,0,0,1,0,0},
}; // 邻接矩阵表示图 G
BFS(G, 1, 7); // 从第1个顶点开始进行广度优先搜索
return 0;
}
```
阅读全文