c语言建立一个以邻接表形式储存的图,以邻接表形式储存的图的深度优先遍历,以邻接表形式储存的图的广度优先遍历,在一个代码中实现
时间: 2023-11-22 20:10:47 浏览: 64
好的,以下是一个使用邻接表储存图的深度优先遍历和广度优先遍历的 C 代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 图的最大顶点数
// 定义邻接表中的边结构体
typedef struct EdgeNode {
int adjvex; // 邻接点在图中的位置
struct EdgeNode *next; // 指向下一个邻接点的指针
} EdgeNode;
// 定义邻接表中的顶点结构体
typedef struct VertexNode {
int data; // 顶点信息
EdgeNode *firstedge; // 指向第一个邻接点的指针
} VertexNode, AdjList[MAX_VERTEX_NUM];
// 定义邻接表图结构体
typedef struct {
AdjList adjList; // 邻接表
int vertexNum, edgeNum; // 顶点数和边数
} GraphAdjList;
// 初始化邻接表图
void initGraph(GraphAdjList *G) {
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vertexNum, &G->edgeNum);
printf("请输入每个顶点的信息:\n");
for (int i = 0; i < G->vertexNum; i++) {
scanf("%d", &G->adjList[i].data);
G->adjList[i].firstedge = NULL;
}
printf("请输入每条边的起点和终点:\n");
for (int i = 0; i < G->edgeNum; i++) {
int u, v;
scanf("%d%d", &u, &v);
// 添加边
EdgeNode *edge = (EdgeNode *) malloc(sizeof(EdgeNode));
edge->adjvex = v;
edge->next = G->adjList[u].firstedge;
G->adjList[u].firstedge = edge;
}
}
// 深度优先遍历
void dfs(GraphAdjList G, int v, int *visited) {
printf("%d ", G.adjList[v].data);
visited[v] = 1;
EdgeNode *edge = G.adjList[v].firstedge;
while (edge != NULL) {
int w = edge->adjvex;
if (!visited[w]) {
dfs(G, w, visited);
}
edge = edge->next;
}
}
// 广度优先遍历
void bfs(GraphAdjList G, int v, int *visited) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
printf("%d ", G.adjList[v].data);
visited[v] = 1;
queue[rear++] = v;
while (front != rear) {
int u = queue[front++];
EdgeNode *edge = G.adjList[u].firstedge;
while (edge != NULL) {
int w = edge->adjvex;
if (!visited[w]) {
printf("%d ", G.adjList[w].data);
visited[w] = 1;
queue[rear++] = w;
}
edge = edge->next;
}
}
}
int main() {
GraphAdjList G;
initGraph(&G);
printf("深度优先遍历结果:");
int visited[MAX_VERTEX_NUM] = {0};
for (int i = 0; i < G.vertexNum; i++) {
if (!visited[i]) {
dfs(G, i, visited);
}
}
printf("\n广度优先遍历结果:");
for (int i = 0; i < G.vertexNum; i++) {
visited[i] = 0;
}
for (int i = 0; i < G.vertexNum; i++) {
if (!visited[i]) {
bfs(G, i, visited);
}
}
printf("\n");
return 0;
}
```
该代码中使用邻接表存储图,并实现了深度优先遍历和广度优先遍历。在 `initGraph` 函数中,用户需要输入图的顶点数、边数、每个顶点的信息以及每条边的起点和终点。在 `dfs` 函数中,使用递归实现深度优先遍历;在 `bfs` 函数中,使用队列实现广度优先遍历。
阅读全文