用c语言实现图的遍历(深度优先和广度优先)
时间: 2024-02-09 12:04:23 浏览: 118
以下是使用C语言实现图的深度优先遍历和广度优先遍历的代码:
深度优先遍历:
```c
#define MAX 100
int visited[MAX] = {0}; // 全局数组
void DFS(AdjGraph *G, int v) // 深度优先遍历算法
{
ArcNode *p;
visited[v] = 1; // 置已访问标记
printf("%d ", v); // 输出被访问顶点的编号
p = G->adjlist[v].firstarc;
while (p != NULL) // p指向顶点v的第一个邻接点
{
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; // 标记已访问
rear = (rear + 1) % MAX;
queue[rear] = v; // 入队列
while (front != rear) // 队列不为空
{
front = (front + 1) % MAX;
v = queue[front]; // 出队列
p = G->adjlist[v].firstarc;
while (p != NULL) // 找v的邻接点
{
if (visited[p->adjvex] == 0) // 若未访问
{
printf("%d ", p->adjvex);
visited[p->adjvex] = 1; // 标记已访问
rear = (rear + 1) % MAX;
queue[rear] = p->adjvex; // 入队列
}
p = p->nextarc; // 找v的下一个邻接点
}
}
}
```
阅读全文