C语言编程完成基于邻接表的图的非递归深度遍历和广度遍历
时间: 2024-02-09 12:10:26 浏览: 84
好的,我可以为您解答这个问题。
首先,让我们来了解一下邻接表的概念。邻接表是一种表示图的数据结构,它通过链表的方式存储每个节点和与其相邻的节点。对于无向图,每个节点的邻居节点都要存储两次,因为邻居节点既可以是出边,也可以是入边。
接下来,我们分别介绍非递归深度遍历和广度遍历的实现方法。
非递归深度遍历:
使用栈来实现非递归深度遍历。
1. 将起点节点入栈。
2. 当栈不为空时,弹出栈顶节点,访问它。
3. 将该节点的未被访问的邻居节点入栈。
4. 重复步骤2-3,直到栈为空。
代码实现如下:
```c
void DFS(Graph *g, int start) {
int visited[MAX_VERTEX_NUM] = {0};
int i, j;
int top = -1;
int stack[MAX_VERTEX_NUM];
// 将起点入栈
stack[++top] = start;
while (top > -1) {
// 取出栈顶元素
int v = stack[top--];
if (!visited[v]) {
printf("%d ", v);
visited[v] = 1;
// 遍历该节点的邻居节点
for (j = g->adjlist[v].firstarc; j != -1; j = g->adjlist[j].nextarc) {
if (!visited[j]) {
// 未被访问的邻居节点入栈
stack[++top] = j;
}
}
}
}
}
```
广度遍历:
使用队列来实现广度遍历。
1. 将起点节点入队。
2. 当队列不为空时,弹出队首节点,访问它。
3. 将该节点的未被访问的邻居节点入队。
4. 重复步骤2-3,直到队列为空。
代码实现如下:
```c
void BFS(Graph *g, int start) {
int visited[MAX_VERTEX_NUM] = {0};
int i, j;
int front = -1, rear = -1;
int queue[MAX_VERTEX_NUM];
// 将起点入队
queue[++rear] = start;
while (front < rear) {
// 取出队首元素
int v = queue[++front];
if (!visited[v]) {
printf("%d ", v);
visited[v] = 1;
// 遍历该节点的邻居节点
for (j = g->adjlist[v].firstarc; j != -1; j = g->adjlist[j].nextarc) {
if (!visited[j]) {
// 未被访问的邻居节点入队
queue[++rear] = j;
}
}
}
}
}
```
以上就是基于邻接表的图的非递归深度遍历和广度遍历的实现方法。
阅读全文