c语言邻接表dfs算法代码
时间: 2024-05-22 21:09:05 浏览: 133
邻接表代码
4星 · 用户满意度95%
邻接表是图的一种常用存储结构,DFS(深度优先搜索)算法则是解决图遍历问题的一种常用算法。下面是C语言邻接表DFS算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表结构体定义
typedef struct ArcNode {
int adjvex; // 邻接点的位置
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 存储顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图的顶点数和边数
} ALGraph;
// 标记顶点是否被访问过的数组,0表示未访问,1表示已访问
int visited[MAX_VERTEX_NUM] = {0};
// DFS函数
void DFS(ALGraph *G, int v) {
ArcNode *p;
visited[v] = 1;
printf("%d ", G->vertices[v].data); // 访问顶点v
for (p = G->vertices[v].firstarc; p; p = p->next) {
if (!visited[p->adjvex]) { // 如果p未被访问,则递归访问它
DFS(G, p->adjvex);
}
}
}
// 创建邻接表
void CreateALGraph(ALGraph *G) {
int i, j, k;
ArcNode *p;
printf("请输入图的顶点数和边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("请输入每个顶点的值:");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vertices[i].data);
G->vertices[i].firstarc = NULL;
}
printf("请输入每条边的两个端点:\n");
for (k = 0; k < G->arcnum; k++) {
scanf("%d %d", &i, &j);
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->next = G->vertices[i].firstarc;
G->vertices[i].firstarc = p;
// 因为是无向图,所以反向也要存储一次
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = i;
p->next = G->vertices[j].firstarc;
G->vertices[j].firstarc = p;
}
}
int main() {
ALGraph G;
CreateALGraph(&G);
printf("DFS遍历结果:");
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) { // 如果该顶点未被访问,则从它开始DFS遍历
DFS(&G, i);
}
}
return 0;
}
```
阅读全文