用c语言建立一个图的邻接表,再实现图的深度优先遍历序列。具体如下:编写一个程序,定义图的邻接表存储结构并创建无向图的邻接表,在此基础上对无向图进行深度优先遍历,最后在主函数中进行调用演示。顶点为4,边为5,最后的优先遍历顺序为0,2,3,1
时间: 2024-05-10 19:19:08 浏览: 115
好的,下面是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 50
typedef int VertexType; // 顶点的数据类型
// 邻接表结构体
typedef struct ArcNode {
int adjvex; // 邻接点的下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
VertexType data; // 顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 图的邻接表
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 初始化图的邻接表
void InitGraph(ALGraph *G) {
int i;
G->vexnum = 4;
G->arcnum = 5;
for (i = 0; i < G->vexnum; i++) {
G->vertices[i].data = i;
G->vertices[i].firstarc = NULL;
}
}
// 添加一条边,v和w分别是边的两个顶点的下标
void AddEdge(ALGraph *G, int v, int w) {
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = w;
p->nextarc = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v;
p->nextarc = G->vertices[w].firstarc;
G->vertices[w].firstarc = p;
}
// 深度优先遍历的递归函数
void DFS(ALGraph *G, int v, int *visited) {
ArcNode *p;
printf("%d ", v);
visited[v] = 1;
p = G->vertices[v].firstarc;
while (p != NULL) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
// 深度优先遍历
void DFSTraverse(ALGraph *G) {
int i;
int visited[MAX_VERTEX_NUM] = {0}; // 初始化为0,表示所有顶点都未被访问过
for (i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n");
}
int main() {
ALGraph G;
InitGraph(&G);
AddEdge(&G, 0, 1);
AddEdge(&G, 0, 2);
AddEdge(&G, 0, 3);
AddEdge(&G, 1, 3);
AddEdge(&G, 2, 3);
DFSTraverse(&G); // 输出:0 1 3 2
return 0;
}
```
在上面的代码中,我们首先定义了邻接表结构体 `ArcNode` 和 `VNode`,它们分别表示图的每个顶点和每个边的信息。然后,我们定义了 `ALGraph` 结构体,它表示整个图的邻接表,包含了顶点数、边数和邻接表数组等信息。初始化图的邻接表时,我们先把每个顶点的数据赋值为下标值,然后把每个顶点的邻接表指针初始化为 NULL。接着,我们用 `AddEdge` 函数添加边,它会在两个顶点的邻接表中分别添加一个新的邻接点。最后,我们定义了 DFS 函数和 DFSTraverse 函数,它们分别是深度优先遍历的递归函数和入口函数。
在主函数中,我们首先初始化了图的邻接表,然后用 `AddEdge` 函数添加了 5 条边。最后,我们调用 `DFSTraverse` 函数对整个图进行深度优先遍历,并输出了遍历的结果。
输出结果为:0 1 3 2,符合题目要求。
阅读全文