用C语言写一个图的邻接链表存储及递归深度优先遍历的完整代码
时间: 2023-12-04 11:03:19 浏览: 226
图的存储与遍历(C语言实现)
5星 · 资源好评率100%
好的,以下是用C语言实现图的邻接链表存储及递归深度优先遍历的完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 邻接表中的边结点
typedef struct ArcNode {
int adjvex; // 邻接点在数组中的下标
struct ArcNode *next; // 指向下一个邻接点
} ArcNode;
// 邻接表中的顶点结点
typedef struct VNode {
char data; // 顶点的数据
ArcNode *firstarc; // 指向第一条依附该顶点的边
} VNode, AdjList[MAX_VERTEX_NUM];
// 图的结构体
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 初始化邻接表
void InitGraph(ALGraph *G) {
// 初始化所有顶点的第一条边为NULL
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].firstarc = NULL;
}
G->vexnum = 0;
G->arcnum = 0;
}
// 插入顶点
void InsertVertex(ALGraph *G, char v) {
G->vertices[G->vexnum].data = v;
G->vexnum++;
}
// 插入边
void InsertArc(ALGraph *G, int i, int j) {
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->next = G->vertices[i].firstarc;
G->vertices[i].firstarc = p;
G->arcnum++;
}
// 递归深度优先遍历
void DFS(ALGraph *G, int v, int visited[]) {
visited[v] = 1;
printf("%c ", G->vertices[v].data);
ArcNode *p = G->vertices[v].firstarc;
while (p != NULL) {
if (visited[p->adjvex] == 0) {
DFS(G, p->adjvex, visited);
}
p = p->next;
}
}
// 深度优先遍历
void DFSTraverse(ALGraph *G) {
int visited[MAX_VERTEX_NUM] = {0};
for (int i = 0; i < G->vexnum; i++) {
if (visited[i] == 0) {
DFS(G, i, visited);
}
}
}
int main() {
ALGraph G;
InitGraph(&G);
// 插入5个顶点
InsertVertex(&G, 'A');
InsertVertex(&G, 'B');
InsertVertex(&G, 'C');
InsertVertex(&G, 'D');
InsertVertex(&G, 'E');
// 插入7条边
InsertArc(&G, 0, 1);
InsertArc(&G, 0, 2);
InsertArc(&G, 1, 2);
InsertArc(&G, 2, 0);
InsertArc(&G, 2, 3);
InsertArc(&G, 3, 3);
InsertArc(&G, 4, 3);
// 深度优先遍历
DFSTraverse(&G);
return 0;
}
```
这段代码实现了一个包含5个顶点和7条边的图,并对其进行了深度优先遍历。在实际使用时,可以根据需要修改顶点数和边数,以及对应的顶点数据和边的起点和终点。
阅读全文