c语言建立一个以邻接表形式储存的图,以邻接表形式储存的图的深度优先遍历,以邻接表形式储存的图的广度优先遍历
时间: 2023-11-22 22:10:47 浏览: 86
图的邻接表转邻接矩阵和深度遍历
好的,以下是建立邻接表形式储存的图,以及深度优先遍历和广度优先遍历的 C 语言代码实现。
建立邻接表形式储存的图:
```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 *first; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 图
typedef struct {
AdjList vertices; // 顶点表
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 建立无向图的邻接表存储结构
void CreateUDG(ALGraph *G) {
int i, j, k;
ArcNode *e;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("请输入 %d 个顶点数据:\n", G->vexnum);
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vertices[i].data);
G->vertices[i].first = NULL; // 初始化邻接表为空
}
printf("请输入 %d 条边:\n", G->arcnum);
for (k = 0; k < G->arcnum; k++) {
printf("请输入边的头和尾的顶点下标:\n");
scanf("%d %d", &i, &j);
// 添加边的尾结点
e = (ArcNode*) malloc(sizeof(ArcNode));
e->adjvex = j;
e->next = G->vertices[i].first;
G->vertices[i].first = e;
// 添加边的头结点
e = (ArcNode*) malloc(sizeof(ArcNode));
e->adjvex = i;
e->next = G->vertices[j].first;
G->vertices[j].first = e;
}
}
```
深度优先遍历:
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
int visited[MAX_VERTEX_NUM]; // 标记数组
// 从顶点 i 开始深度优先遍历图 G
void DFS(ALGraph *G, int i) {
ArcNode *p;
visited[i] = 1; // 标记顶点 i 为已访问
printf("%d ", G->vertices[i].data); // 输出顶点 i 的数据
p = G->vertices[i].first; // 获取顶点 i 的第一个邻接点
while (p != NULL) {
if (!visited[p->adjvex]) { // 如果邻接点未被访问
DFS(G, p->adjvex); // 递归访问邻接点
}
p = p->next; // 访问下一个邻接点
}
}
// 深度优先遍历图 G
void DFSTraverse(ALGraph *G) {
int i;
for (i = 0; i < G->vexnum; i++) { // 初始化标记数组
visited[i] = 0;
}
for (i = 0; i < G->vexnum; i++) { // 遍历所有顶点
if (!visited[i]) { // 如果顶点未被访问
DFS(G, i); // 从该顶点开始深度优先遍历
}
}
}
```
广度优先遍历:
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
int visited[MAX_VERTEX_NUM]; // 标记数组
int queue[MAX_VERTEX_NUM]; // 队列
int front = 0, rear = 0; // 队列的头和尾指针
// 从顶点 i 开始广度优先遍历图 G
void BFS(ALGraph *G, int i) {
ArcNode *p;
visited[i] = 1; // 标记顶点 i 为已访问
printf("%d ", G->vertices[i].data); // 输出顶点 i 的数据
queue[rear++] = i; // 将顶点 i 入队
while (front != rear) { // 如果队列不为空
i = queue[front++]; // 从队列中取出一个顶点
p = G->vertices[i].first; // 获取顶点 i 的第一个邻接点
while (p != NULL) {
if (!visited[p->adjvex]) { // 如果邻接点未被访问
visited[p->adjvex] = 1; // 标记邻接点为已访问
printf("%d ", G->vertices[p->adjvex].data); // 输出邻接点的数据
queue[rear++] = p->adjvex; // 将邻接点入队
}
p = p->next; // 访问下一个邻接点
}
}
}
// 广度优先遍历图 G
void BFSTraverse(ALGraph *G) {
int i;
for (i = 0; i < G->vexnum; i++) { // 初始化标记数组
visited[i] = 0;
}
for (i = 0; i < G->vexnum; i++) { // 遍历所有顶点
if (!visited[i]) { // 如果顶点未被访问
BFS(G, i); // 从该顶点开始广度优先遍历
}
}
}
```
希望这些代码可以帮助你实现邻接表形式储存的图的深度优先遍历和广度优先遍历。
阅读全文