利用邻接表实现图的深度优先遍历,使用c语言
时间: 2023-11-20 21:11:17 浏览: 93
好的,下面给出使用邻接表实现图的深度优先遍历的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 定义邻接表中每个节点的结构体
typedef struct ArcNode {
int adjvex; // 邻接点在图中的位置
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
// 定义邻接表中每个头节点的结构体
typedef struct VNode {
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode;
// 定义图的结构体
typedef struct {
VNode vertex[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
} Graph;
// 初始化图
void initGraph(Graph *G, int n) {
G->vexnum = n;
for(int i = 0; i < n; i++) {
G->vertex[i].data = i;
G->vertex[i].firstarc = NULL;
}
}
// 添加边
void addEdge(Graph *G, int i, int j) {
ArcNode *node = (ArcNode*)malloc(sizeof(ArcNode));
node->adjvex = j;
node->nextarc = G->vertex[i].firstarc;
G->vertex[i].firstarc = node;
}
// 深度优先遍历
void DFS(Graph *G, int i, int *visited) {
visited[i] = 1; // 标记该节点已被访问
printf("%d ", G->vertex[i].data);
// 遍历该节点的所有邻接点
ArcNode *p = G->vertex[i].firstarc;
while(p != NULL) {
int j = p->adjvex;
if(!visited[j]) { // 如果该邻接点未被访问,则递归遍历
DFS(G, j, visited);
}
p = p->nextarc;
}
}
// 对图进行深度优先遍历
void DFSTraverse(Graph *G) {
int visited[MAX_VERTEX_NUM] = {0}; // 初始所有节点都未被访问
for(int i = 0; i < G->vexnum; i++) {
if(!visited[i]) { // 如果该节点未被访问,则从该节点开始进行深度优先遍历
DFS(G, i, visited);
}
}
}
// 测试
int main() {
Graph G;
initGraph(&G, 5);
addEdge(&G, 0, 1);
addEdge(&G, 0, 2);
addEdge(&G, 1, 2);
addEdge(&G, 2, 0);
addEdge(&G, 2, 3);
addEdge(&G, 3, 3);
printf("深度优先遍历结果:");
DFSTraverse(&G);
printf("\n");
return 0;
}
```
上述代码中,我们使用了邻接表来表示图,每个节点包含了一个顶点的数据和一个指向该顶点的第一个邻接点的指针。在添加边时,我们将邻接点添加到该顶点的邻接表中,并将其作为第一个邻接点。在深度优先遍历时,我们从未被访问的节点开始进行遍历,标记该节点已被访问,并输出该节点的数据。然后,我们遍历该节点的所有邻接点,如果该邻接点未被访问,则递归遍历该邻接点。最后,我们对所有未被访问的节点进行深度优先遍历,直到所有节点都被访问为止。
阅读全文