邻接矩阵和邻接表的广度优先算法和深度优先算法遍历表C语言
时间: 2024-12-15 18:24:28 浏览: 7
C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
在图论中,邻接矩阵和邻接表都是常用的表示图数据结构的方式。
1. **邻接矩阵**:
- 广度优先搜索 (BFS):从起点开始,按照层级顺序依次访问每个节点。可以使用队列来辅助,先放入起点,然后逐出并访问当前节点的所有邻居,再将邻居加入队列。BFS通常用于查找最短路径。
- 深度优先搜索 (DFS):同样从起点出发,但采用栈作为辅助数据结构。访问完一个节点后,立即进入它的未访问邻居,直到所有邻居都探索过或者找到目标节点。DFS常用于递归或连通性判断。
2. **邻接表**:
- BFS:因为邻接表更侧重于存储邻居节点的链接,所以也可以通过遍历链表来实现BFS。从起点开始,每访问一个节点就添加到队列,并将所有未访问的邻居加入队列。
- DFS:对于邻接表,DFS则更为直接,从起点开始,沿着一条边走到底,访问所有可达的节点,然后回溯到上一个节点继续探查其他分支,直到所有的路径都被检查过。
以下是用C语言实现这两个算法的简单示例:
```c
// 示例用邻接矩阵表示
void bfs_matrix(int graph[][V], int start, int visited[]) {
queue<int> q;
visited[start] = 1;
q.push(start);
while (!q.empty()) {
int top = q.front();
printf("%d ", top); // 打印节点
q.pop();
for (int i = 0; i < V; ++i)
if (!visited[i] && graph[top][i])
visited[i] = 1, q.push(i);
}
}
void dfs_matrix(int graph[][V], int start, int visited[]) {
visited[start] = 1;
printf("%d ", start); // 打印节点
for (int i = 0; i < V; ++i)
if (!visited[i] && graph[start][i])
dfs_matrix(graph, i, visited);
}
// 示例用邻接表表示
void bfs_adj_list(Node* adj[], int start, bool visited[]) {
queue<Node*> q;
visited[start] = true;
q.push(adj[start]);
while (!q.empty()) {
Node* node = q.front();
printf("%d ", node->data); // 打印节点
q.pop();
for (Node* nei : node->adjacent)
if (!visited[nei->data])
visited[nei->data] = true, q.push(nei);
}
}
void dfs_adj_list(Node* adj[], int start, bool visited[]) {
visited[start] = true;
printf("%d ", start); // 打印节点
dfs_helper(adj, start, visited);
return;
}
```
阅读全文