用c语言对图的邻接表进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。
时间: 2024-02-13 09:01:56 浏览: 135
图的深度优先遍历与广度优先遍历(C语言实现)
5星 · 资源好评率100%
好的,下面是使用C语言对图的邻接表进行深度优先搜索和广度优先搜索遍历的示例代码。假设图的顶点数为n,邻接表的头指针数组为head[],使用一个visited[]数组记录每个顶点是否被访问过。为了方便起见,我们自定义了一个辅助队列,并且假设所有顶点的编号从0开始:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100 // 最大顶点数
#define INF 0x3f3f3f3f // 定义正无穷
typedef struct EdgeNode { // 邻接表中的边
int to; // 目标顶点
int weight; // 权重
struct EdgeNode *next; // 下一条边
} EdgeNode;
typedef struct VertexNode { // 邻接表中的顶点
int id; // 顶点编号
EdgeNode *head; // 第一条边
} VertexNode;
VertexNode adjList[MAXN]; // 邻接表
int visited[MAXN]; // 记录每个顶点是否被访问过
int queue[MAXN]; // 辅助队列
int front = 0, rear = 0; // 队列的头尾指针
// 添加一条边,from为源顶点,to为目标顶点,weight为边的权重
void addEdge(int from, int to, int weight) {
EdgeNode *edge = (EdgeNode *) malloc(sizeof(EdgeNode));
edge->to = to;
edge->weight = weight;
edge->next = adjList[from].head;
adjList[from].head = edge; // 将新边插入到链表的头部
}
// 深度优先搜索遍历
void dfs(int u) {
visited[u] = 1; // 标记该顶点已被访问
printf("%d ", u); // 输出遍历序列
EdgeNode *edge = adjList[u].head;
while (edge != NULL) {
int v = edge->to;
if (!visited[v]) { // 如果该顶点未被访问,则递归访问它
dfs(v);
}
edge = edge->next; // 继续遍历下一条边
}
}
// 广度优先搜索遍历
void bfs(int u) {
visited[u] = 1; // 标记该顶点已被访问
printf("%d ", u); // 输出遍历序列
queue[rear++] = u; // 将该顶点入队
while (front != rear) { // 当队列不为空时
int u = queue[front++]; // 取出队首元素
EdgeNode *edge = adjList[u].head;
while (edge != NULL) {
int v = edge->to;
if (!visited[v]) { // 如果该顶点未被访问,则标记为已访问并入队
visited[v] = 1;
printf("%d ", v); // 输出遍历序列
queue[rear++] = v;
}
edge = edge->next; // 继续遍历下一条边
}
}
}
int main() {
int n, m; // n为顶点数,m为边数
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w); // 添加一条从u到v的边
addEdge(v, u, w); // 添加一条从v到u的边(无向图)
}
// 深度优先搜索遍历
printf("DFS: ");
for (int i = 0; i < n; i++) {
if (!visited[i]) { // 如果该顶点未被访问,则从该顶点开始深度优先搜索遍历
dfs(i);
}
}
printf("\n");
// 广度优先搜索遍历
for (int i = 0; i < n; i++) {
visited[i] = 0; // 重置visited数组
}
printf("BFS: ");
for (int i = 0; i < n; i++) {
if (!visited[i]) { // 如果该顶点未被访问,则从该顶点开始广度优先搜索遍历
bfs(i);
}
}
printf("\n");
return 0;
}
```
在该代码中,我们先定义了一个EdgeNode结构体表示邻接表中的边,一个VertexNode结构体表示邻接表中的顶点。然后,我们定义了一个adjList数组表示邻接表,其中adjList[i]表示顶点i所对应的链表。我们使用addEdge函数将一条边插入到邻接表中。在dfs函数中,我们使用递归的方式进行深度优先搜索遍历,并使用visited数组记录每个顶点是否被访问过。在bfs函数中,我们使用一个辅助队列进行广度优先搜索遍历。最后,在主函数中,我们读入图的顶点数和边数,并调用dfs和bfs函数进行遍历。
阅读全文