用c语言写 以邻接表位存储结构实现无向图的深度优先遍历操作。
时间: 2024-03-12 17:45:36 浏览: 73
好的,以下是用C语言实现以邻接表为存储结构的无向图的深度优先遍历操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 定义邻接表中的边结点
typedef struct ArcNode {
int adjvex; // 邻接点的下标
struct ArcNode *nextarc; // 指向下一条边的指针
} ArcNode;
// 定义邻接表中的顶点结点
typedef struct VertexNode {
int data; // 顶点的数据信息
ArcNode *firstarc; // 指向第一条依附该顶点的边的指针
} VertexNode;
// 定义无向图结构体
typedef struct {
VertexNode adjlist[MAX_VERTEX_NUM]; // 邻接表
int n, e; // 顶点数和边数
} Graph;
// 初始化无向图
void InitGraph(Graph *G) {
int i;
G->n = G->e = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->adjlist[i].data = 0;
G->adjlist[i].firstarc = NULL;
}
}
// 向无向图中插入一条边
void InsertEdge(Graph *G, int u, int v) {
ArcNode *p, *q;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v;
p->nextarc = G->adjlist[u].firstarc;
G->adjlist[u].firstarc = p;
q = (ArcNode *)malloc(sizeof(ArcNode));
q->adjvex = u;
q->nextarc = G->adjlist[v].firstarc;
G->adjlist[v].firstarc = q;
G->e++;
}
// 深度优先遍历
void DFS(Graph *G, int v, int visited[]) {
ArcNode *p;
visited[v] = 1; // 标记该顶点已访问
printf("%d ", G->adjlist[v].data); // 输出该顶点
p = G->adjlist[v].firstarc;
while (p != NULL) {
if (visited[p->adjvex] == 0) { // 如果邻接点未被访问,则递归访问它
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
int main() {
Graph G;
int i, j, visited[MAX_VERTEX_NUM];
InitGraph(&G);
G.n = 6;
for (i = 0; i < G.n; i++) {
G.adjlist[i].data = i + 1;
}
InsertEdge(&G, 0, 1);
InsertEdge(&G, 0, 2);
InsertEdge(&G, 1, 3);
InsertEdge(&G, 2, 3);
InsertEdge(&G, 2, 4);
InsertEdge(&G, 3, 5);
printf("深度优先遍历:");
for (i = 0; i < G.n; i++) {
visited[i] = 0;
}
for (i = 0; i < G.n; i++) {
if (visited[i] == 0) {
DFS(&G, i, visited);
}
}
printf("\n");
return 0;
}
```
这段代码中,我们定义了邻接表中的边结点和顶点结点,并且定义了无向图的结构体。在初始化无向图时,我们将顶点数和边数都设置为0,并将邻接表中的每个顶点的数据信息和第一条边的指针都设置为NULL。在向无向图中插入一条边时,我们需要创建两个边结点,一个插入到顶点u的边表中,另一个插入到顶点v的边表中。
在深度优先遍历中,我们使用了递归的方式来遍历图。我们从某个顶点v开始遍历,首先标记该顶点已经访问过,并输出该顶点的数据信息。然后遍历v的所有邻接点,如果邻接点未被访问,则递归访问它。这样,我们就可以遍历整个无向图了。
阅读全文