用C语言写一个BFS
时间: 2023-08-31 14:32:17 浏览: 219
### 回答1:
在 C 语言中,可以使用队列数据结构实现 BFS 算法。
实现 BFS 的步骤如下:
1. 创建一个队列,并将起始节点加入队列。
2. 当队列不为空时,取出队头元素并标记为已访问。
3. 将当前节点的所有未访问的相邻节点加入队列。
4. 重复步骤 2 和 3,直到队列为空或者找到目标节点。
以下是一个简单的 BFS 的代码实现:
```
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int Boolean;
Boolean visited[MAX_VERTEX_NUM];
int front,rear;
int queue[MAX_VERTEX_NUM];
int graph[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertex_num;
Status init_graph(int vertex_num)
{
int i,j;
for(i=0;i<vertex_num;i++)
{
visited[i]=FALSE;
for(j=0;j<vertex_num;j++)
graph[i][j]=0;
}
return OK;
}
void BFS(int start)
{
int i;
visited[start]=TRUE;
printf("%d ",start);
queue[rear++]=start;
while(front!=rear)
{
int u=queue[front++];
for(i=0;i<vertex_num;i++)
{
if(graph[u][i]==1&&visited[i]==FALSE)
{
visited[i]=TRUE;
printf("%d ",i);
queue[rear++]=i;
}
}
}
}
int main()
{
int i,j,start;
printf("请输入顶点数:");
scanf("%d",&vertex_num);
init_graph(vertex_num);
printf("请输入边数:");
int edge_num;
scanf("
### 回答2:
BFS(广度优先搜索)是一种图形搜索算法,用于在一个图中寻找从起点到终点的最短路径。下面是用C语言编写一个BFS的简单示例:
```c
#include <stdio.h>
#define MAX_SIZE 100
// 定义队列结构
typedef struct {
int items[MAX_SIZE];
int front;
int rear;
} Queue;
// 创建队列
Queue* createQueue() {
Queue* queue = malloc(sizeof(Queue));
queue->front = -1;
queue->rear = -1;
return queue;
}
// 判断队列是否为空
int isEmpty(Queue* queue) {
if (queue->rear == -1)
return 1;
else
return 0;
}
// 入队
void enqueue(Queue* queue, int value) {
if (queue->rear == MAX_SIZE - 1)
printf("队列已满\n");
else {
if (queue->front == -1)
queue->front = 0;
queue->rear++;
queue->items[queue->rear] = value;
}
}
// 出队
int dequeue(Queue* queue) {
int item;
if (isEmpty(queue)) {
printf("队列为空\n");
item = -1;
} else {
item = queue->items[queue->front];
queue->front++;
if (queue->front > queue->rear) {
queue->front = -1;
queue->rear = -1;
}
}
return item;
}
// 使用BFS搜索最短路径
void bfs(int adjMatrix[][MAX_SIZE], int visited[], int start, int end, int n) {
Queue* queue = createQueue();
int i, currentNode;
visited[start] = 1;
enqueue(queue, start);
while (!isEmpty(queue)) {
currentNode = dequeue(queue);
printf("%d ", currentNode);
if (currentNode == end)
break;
for (i = 0; i < n; i++) {
if (adjMatrix[currentNode][i] == 1 && !visited[i]) {
enqueue(queue, i);
visited[i] = 1;
}
}
}
free(queue);
}
int main() {
int adjMatrix[MAX_SIZE][MAX_SIZE], visited[MAX_SIZE] = {0};
int nodes, edges, startNode, endNode, i, j;
printf("输入节点数:");
scanf("%d", &nodes);
printf("输入边数:");
scanf("%d", &edges);
printf("输入边的连接关系:\n");
for (i = 0; i < edges; i++) {
int a, b;
scanf("%d %d", &a, &b);
adjMatrix[a][b] = 1;
adjMatrix[b][a] = 1;
}
printf("输入起点和终点:");
scanf("%d %d", &startNode, &endNode);
printf("BFS搜索的路径为:");
bfs(adjMatrix, visited, startNode, endNode, nodes);
return 0;
}
```
以上代码实现了一个简单的BFS算法。用户可以根据需要输入节点数、边数和边的连接关系,然后输入起点和终点,程序将输出从起点到终点的最短路径。
### 回答3:
BFS(广度优先搜索)是一种用于图或树结构中的搜索算法,通过按照层级顺序依次访问节点,从而实现对数据结构的遍历。
下面是一个使用C语言编写的BFS算法的示例:
```c
#include <stdio.h>
#define MAX_NODES 100
int graph[MAX_NODES][MAX_NODES]; // 图的邻接矩阵
int visited[MAX_NODES]; // 记录节点的访问状态
// 队列相关操作
int queue[MAX_NODES];
int front = -1;
int rear = -1;
void enqueue(int x) {
if (rear == MAX_NODES - 1) {
printf("队列已满!\n");
return;
}
if (front == -1) {
front = 0;
}
rear++;
queue[rear] = x;
}
int dequeue() {
if (front == -1 || front > rear) {
printf("队列为空!\n");
return -1;
}
int x = queue[front];
front++;
return x;
}
// BFS函数
void bfs(int start, int numNodes) {
enqueue(start);
visited[start] = 1;
while(front != -1 && front <= rear) {
int currentNode = dequeue();
printf("%d ", currentNode);
for (int i = 0; i < numNodes; i++) {
if (graph[currentNode][i] && !visited[i]) {
enqueue(i);
visited[i] = 1;
}
}
}
}
int main() {
int numNodes, numEdges;
printf("请输入图的节点数和边数:");
scanf("%d %d", &numNodes, &numEdges);
printf("请输入边的信息(格式为节点i 节点j):\n");
for (int i = 0; i < numEdges; i++) {
int node1, node2;
scanf("%d %d", &node1, &node2);
graph[node1][node2] = 1;
// 如果是无向图,还需要将graph[node2][node1]置为1
}
int startNode;
printf("请输入开始遍历的节点:");
scanf("%d", &startNode);
printf("广度优先搜索结果为:");
bfs(startNode, numNodes);
return 0;
}
```
这个示例中,我们首先通过读取用户输入来构建一个图的邻接矩阵,表示图的节点和边的关系。然后用户输入开始遍历的节点,程序使用BFS算法进行遍历并输出结果。
阅读全文