写一个程序,演示在连通的无向图上访问全部节点的操作。以邻接表为存储结构,实现连通无向图的广度优先遍历,以用户指定的节点为起点,分别输出遍历的节点访问序列。用c语言写
时间: 2024-12-24 08:40:32 浏览: 6
在C语言中,我们可以使用邻接表来表示无向图,并通过广度优先搜索(BFS)算法来访问所有连通的节点。下面是一个简单的示例程序,它使用队列数据结构来完成这个任务:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <queue>
// 结构体定义邻接表中的节点
typedef struct Node {
int data; // 节点值
struct Node* next; // 指向下一个邻居的指针
} Node;
// 遍历函数,采用BFS从给定节点开始
void bfs(Node** graph, int start, int n) {
bool visited[n + 1]; // 记录每个节点是否被访问过
queue<int> q; // 存储待访问节点的队列
// 初始化
for (int i = 0; i <= n; i++) {
visited[i] = false;
}
q.push(start);
visited[start] = true;
printf("从 %d 开始的遍历序列: ", start);
while (!q.empty()) {
int curr = q.front();
q.pop();
printf("%d ", curr); // 输出当前节点
// 将当前节点的未访问邻居加入队列
Node* temp = graph[curr];
while (temp != NULL) {
if (!visited[temp->data]) {
visited[temp->data] = true;
q.push(temp->data);
}
temp = temp->next;
}
}
printf("\n");
}
// 创建邻接表并填充数据 (这里仅做演示,实际应用需根据具体图设计)
void createAdjacencyList(Node** graph, int n, ...) {
// 实现添加边的具体逻辑
// 这里假设输入的是两对节点,代表它们之间有边连接
for (int i = 0; i < n; ++i) {
// ... 根据实际需要添加边
graph[i]->next = &graph[i+1];
}
graph[n] = NULL; // 确保最后一个节点的链表结束
}
int main() {
int nodes = 5; // 假设我们有一个包含5个节点的无向图
Node** graph = (Node**)malloc(sizeof(Node*) * (nodes + 1)); // 预分配内存
createAdjacencyList(graph, nodes);
// 用户指定的起始节点(例如,从1开始)
int start = 1;
bfs(graph, start, nodes);
free(graph); // 释放内存
return 0;
}
```
阅读全文