C语言,实现图的深度优先遍历和广度优先遍历
时间: 2023-12-05 20:39:46 浏览: 118
以下是C语言实现图的深度优先遍历和广度优先遍历的代码:
深度优先遍历:
```c
#define MAX 100
int visited[MAX] = {0}; // 全局数组,用于标记节点是否被访问过
// 深度优先遍历算法
void DFS(AdjGraph *G, int v) {
ArcNode *p;
visited[v] = 1; // 标记节点v已被访问
printf("%d ", v); // 输出被访问顶点的编号
p = G->adjlist[v].firstarc;
while (p != NULL) {
if (visited[p->adjvex] == 0) { // 若p->adjvex顶点未被访问,递归访问它
DFS(G, p->adjvex);
}
p = p->nextarc; // p指向顶点v的下一个邻接点
}
}
```
广度优先遍历:
```c
#define MAX 100
int visited[MAX] = {0}; // 全局数组,用于标记节点是否被访问过
// 广度优先遍历算法
void BFS(AdjGraph *G, int v) {
ArcNode *p;
int queue[MAX], front = 0, rear = 0; // 定义队列
int visited[MAX] = {0}; // 标记节点是否被访问过
printf("%d ", v); // 输出被访问顶点的编号
visited[v] = 1; // 标记节点v已被访问
rear = (rear + 1) % MAX;
queue[rear] = v; // 将节点v入队
while (front != rear) { // 队列不为空时循环
front = (front + 1) % MAX;
v = queue[front]; // 出队一个节点
p = G->adjlist[v].firstarc;
while (p != NULL) {
if (visited[p->adjvex] == 0) { // 若p->adjvex顶点未被访问,访问它并将其入队
printf("%d ", p->adjvex);
visited[p->adjvex] = 1;
rear = (rear + 1) % MAX;
queue[rear] = p->adjvex;
}
p = p->nextarc; // p指向顶点v的下一个邻接点
}
}
}
```
阅读全文