用C语言建立一无向图的邻接表存储结构,并构造其对应的深度优先搜索生成树或森林(该生成树或森林以孩子兄弟链表存储),按先序遍历该二叉链表,输出得到的序列。
时间: 2024-05-06 21:17:12 浏览: 108
邻接表或者邻接矩阵为存储结构实现连通无向图的深度优先和广度优先遍历
3星 · 编辑精心推荐
以下是C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 边表节点结构体
typedef struct EdgeNode {
int adjvex; // 邻接点编号
struct EdgeNode *next; // 指向下一条边的指针
} EdgeNode;
// 顶点表结构体
typedef struct VertexNode {
int data; // 顶点编号
EdgeNode *first; // 指向第一条边的指针
} VertexNode;
// 图结构体
typedef struct {
VertexNode vexs[MAX_VERTEX_NUM]; // 顶点表
int vexnum, edgenum; // 顶点数和边数
} Graph;
// 记录某个顶点是否已经被访问过
int visited[MAX_VERTEX_NUM];
// 创建邻接表存储的图
void createGraph(Graph *G)
{
printf("请输入图的顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->edgenum);
// 初始化顶点表
for (int i = 0; i < G->vexnum; i++) {
G->vexs[i].data = i;
G->vexs[i].first = NULL;
}
// 输入每条边的信息,构建邻接表
printf("请输入每条边的信息(起点 终点):\n");
int v1, v2;
for (int i = 0; i < G->edgenum; i++) {
scanf("%d%d", &v1, &v2);
// 创建新的边表节点
EdgeNode *p = (EdgeNode *)malloc(sizeof(EdgeNode));
p->adjvex = v2;
p->next = G->vexs[v1].first;
// 将新节点插入到边表头
G->vexs[v1].first = p;
// 由于是无向图,所以还要将(v2, v1)添加到邻接表中
EdgeNode *q = (EdgeNode *)malloc(sizeof(EdgeNode));
q->adjvex = v1;
q->next = G->vexs[v2].first;
G->vexs[v2].first = q;
}
}
// 深度优先搜索生成树/森林
void DFSForest(Graph G, int v, EdgeNode **T)
{
visited[v] = 1;
// 遍历顶点v的所有邻接点
EdgeNode *p = G.vexs[v].first;
while (p != NULL) {
int w = p->adjvex;
if (!visited[w]) {
// 将(v, w)插入到生成树/森林中
EdgeNode *q = (EdgeNode *)malloc(sizeof(EdgeNode));
q->adjvex = w;
q->next = *T;
*T = q;
// 递归访问邻接点w
DFSForest(G, w, T);
}
p = p->next;
}
}
// 深度优先搜索生成森林的主函数
void DFSTree(Graph G, EdgeNode **T)
{
*T = NULL;
// 遍历所有未访问的顶点
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFSForest(G, i, T);
}
}
}
// 先序遍历二叉树,输出节点编号
void preOrderTraverse(EdgeNode *T)
{
if (T == NULL) {
return;
}
printf("%d ", T->adjvex);
preOrderTraverse(T->next);
}
int main()
{
Graph G;
createGraph(&G);
EdgeNode *T;
DFSTree(G, &T);
printf("深度优先搜索生成森林的先序遍历序列为:\n");
preOrderTraverse(T);
printf("\n");
return 0;
}
```
输入示例:
```
请输入图的顶点数和边数:7 9
请输入每条边的信息(起点 终点):
0 1
0 2
0 3
1 4
2 4
3 5
4 6
5 6
2 5
```
输出示例:
```
深度优先搜索生成森林的先序遍历序列为:
0 3 5 6 2 4 1
```
阅读全文