c语言以邻接表为数据结构,实现深度优先遍历和广度优先遍历
时间: 2024-05-15 16:14:18 浏览: 145
c++实现图的邻接表深度优先遍历,广度优先遍历
以邻接表作为数据结构的图,可以使用深度优先遍历(DFS)和广度优先遍历(BFS)两种方式进行遍历。下面是 C 语言实现 DFS 和 BFS 的代码示例。
首先,定义图的邻接表数据结构:
```c
#define MAX_VERTEX_NUM 100 //最大顶点数
typedef struct ArcNode { //边结点结构体
int adjvex; //邻接点在顶点数组中的下标
struct ArcNode* nextarc; //指向下一个邻接点的指针
} ArcNode;
typedef struct VNode { //头结点结构体
int data; //顶点数据
ArcNode* firstarc; //指向第一个邻接点的指针
} VNode;
typedef struct { //图结构体
VNode adjlist[MAX_VERTEX_NUM]; //邻接表
int vexnum, arcnum; //顶点数和边数
} ALGraph;
```
然后,实现 DFS 函数:
```c
void DFS(ALGraph* G, int v, int visited[]) {
visited[v] = 1; //标记该顶点已被访问
printf("%d ", G->adjlist[v].data); //访问该顶点
ArcNode* p = G->adjlist[v].firstarc;
while (p) {
if (!visited[p->adjvex]) { //若邻接点未被访问,则递归访问它
DFS(G, p->adjvex, visited);
}
p = p->nextarc; //指向下一个邻接点
}
}
```
最后,实现 BFS 函数:
```c
void BFS(ALGraph* G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM]; //定义队列
int front = -1, rear = -1; //队首和队尾指针初始化为-1
visited[v] = 1; //标记该顶点已被访问
printf("%d ", G->adjlist[v].data); //访问该顶点
queue[++rear] = v; //将该顶点入队
while (front != rear) { //队列不为空时循环
int w = queue[++front]; //取出队首元素
ArcNode* p = G->adjlist[w].firstarc;
while (p) {
if (!visited[p->adjvex]) { //若邻接点未被访问,则标记并入队
visited[p->adjvex] = 1;
printf("%d ", G->adjlist[p->adjvex].data);
queue[++rear] = p->adjvex;
}
p = p->nextarc; //指向下一个邻接点
}
}
}
```
注意,以上代码中的 `visited` 数组用于标记顶点是否已被访问,需要在主函数中初始化为 0。
阅读全文