广度优先遍历算法c语言
时间: 2023-10-26 15:23:55 浏览: 149
广度优先遍历(BFS)是一种用于图的遍历算法,用于遍历或搜索图中的节点。下面是一个使用C语言实现广度优先遍历的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义图的最大节点数量
#define MAX_NODES 100
// 定义图的邻接矩阵表示
int graph[MAX_NODES][MAX_NODES];
// 定义队列结构
typedef struct {
int data[MAX_NODES];
int front;
int rear;
} Queue;
// 初始化队列
void initializeQueue(Queue* queue) {
queue->front = -1;
queue->rear = -1;
}
// 判断队列是否为空
int isQueueEmpty(Queue* queue) {
return queue->front == -1;
}
// 入队操作
void enqueue(Queue* queue, int item) {
if (queue->rear == MAX_NODES - 1) {
printf("Queue is full\n");
} else {
if (queue->front == -1) {
queue->front = 0;
}
queue->rear++;
queue->data[queue->rear] = item;
}
}
// 出队操作
int dequeue(Queue* queue) {
int item;
if (isQueueEmpty(queue)) {
printf("Queue is empty\n");
return -1;
} else {
item = queue->data[queue->front];
if (queue->front >= queue->rear) {
queue->front = -1;
queue->rear = -1;
} else {
queue->front++;
}
return item;
}
}
// 广度优先遍历函数
void breadthFirstSearch(int startNode, int numNodes) {
Queue queue;
int visited[MAX_NODES] = {0}; // 记录节点是否被访问过
initializeQueue(&queue);
visited[startNode] = 1; // 标记起始节点为已访问
enqueue(&queue, startNode);
while (!isQueueEmpty(&queue)) {
int currentNode = dequeue(&queue);
printf("%d ", currentNode);
// 遍历当前节点的邻居节点
for (int i = 0; i < numNodes; i++) {
if (graph[currentNode][i] == 1 && !visited[i]) {
enqueue(&queue, i);
visited[i] = 1;
}
}
}
}
int main() {
int numNodes, startNode;
printf("Enter the number of nodes: ");
scanf("%d", &numNodes);
printf("Enter the adjacency matrix:\n");
for (int i = 0; i < numNodes; i++) {
for (int j = 0; j < numNodes; j++) {
scanf("%d", &graph[i][j]);
}
}
printf("Enter the starting node: ");
scanf("%d", &startNode);
printf("BFS traversal: ");
breadthFirstSearch(startNode, numNodes);
return 0;
}
```
这是一个简单的广度优先遍历算法的C语言实现。它使用邻接矩阵来表示图,通过队列来辅助实现广度优先遍历。你可以根据需要修改或扩展代码。希望对你有帮助!
阅读全文