建立无向图邻接表存储结构,输出深度和宽度优先遍历顶点访问次序。C语言完整代码
时间: 2024-12-29 18:35:35 浏览: 28
在C语言中,我们可以使用邻接表来存储无向图,并分别实现深度优先搜索(DFS)和广度优先搜索(BFS)。这里给出的是基本的代码框架,你需要根据实际的顶点数(`vertices`)和边数填充相应的邻接列表:
首先,我们定义一个简单的结构体表示节点:
```c
#include <stdbool.h>
#include <stdio.h>
#define MAX_VERTICES 100
typedef struct {
int vertex;
bool visited; // 标记是否已被访问
struct Node* adj; // 指向邻接节点的指针
} Node;
// 创建邻接表表示无向图
void createAdjacencyList(Node* vertices[], int edges[]) {
for (int i = 0; i < MAX_VERTICES; i++) {
vertices[i].visited = false;
vertices[i].adj = NULL;
}
// 这里假设edges数组是一个二维数组,存储了每条边的两端节点索引
for (int i = 0; i < edges.length; i += 2) {
int u = edges[i];
int v = edges[i + 1];
vertices[u].adj = &vertices[v];
vertices[v].adj = &vertices[u]; // 无向图
}
}
```
接下来,我们实现DFS和BFS的遍历:
```c
void dfs(Node* start, char (*print)(int)) {
stack<Node*> s;
s.push(start);
while (!s.empty()) {
Node* node = s.top();
s.pop();
print(node->vertex); // 访问当前节点
if (node->adj != NULL) { // 遍历相邻节点
for (Node* adj : *node->adj) {
if (!adj->visited) {
adj->visited = true;
s.push(adj);
}
}
}
}
}
void bfs(Node* start, char (*print)(int)) {
queue<Node*> q;
q.enqueue(start);
while (!q.empty()) {
Node* node = q.dequeue();
print(node->vertex); // 访问当前节点
for (Node* adj : *node->adj) {
if (!adj->visited) {
adj->visited = true;
q.enqueue(adj);
}
}
}
}
```
最后,你可以这样调用它们:
```c
int main() {
Node vertices[MAX_VERTICES];
int edges[] = {/*你的边的连接信息*/};
createAdjacencyList(vertices, edges);
// 输出DFS顶点访问次序
printf("DFS: ");
dfs(&vertices[0], printf);
// 输出BFS顶点访问次序
printf("\nBFS: ");
bfs(&vertices[0], printf);
return 0;
}
```
注意,这只是一个基础版本,实际应用中需要根据具体需求调整代码细节,比如错误检查、输入数据读取等。
**相关问题--:**
1. 在邻接表中如何添加和删除边?
2. 对于大规模图,这两种算法的空间复杂性有何区别?
3. DFS和BFS的时间复杂性分别是多少?
阅读全文