请用C语言:建立带权值无向图的邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历。
时间: 2024-04-30 10:20:51 浏览: 136
图的深度优先遍历和广度优先遍历
以下是建立带权值无向图的邻接表存储的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 边表节点
typedef struct EdgeNode {
int adjvex; // 邻接点编号
int weight; // 权值
struct EdgeNode* next; // 指向下一个邻接点的指针
} EdgeNode;
// 顶点表节点
typedef struct VertexNode {
int data; // 顶点编号
EdgeNode* firstedge; // 指向第一个邻接点的指针
} VertexNode;
// 图结构体
typedef struct {
VertexNode adjlist[MAX_VERTEX_NUM]; // 邻接表
int vexnum, edgenum; // 顶点数和边数
} Graph;
// 创建邻接表存储的带权值无向图
void CreateGraph(Graph* G) {
printf("输入顶点数和边数(用空格隔开):");
scanf("%d %d", &G->vexnum, &G->edgenum);
// 初始化邻接表
for (int i = 0; i < G->vexnum; i++) {
G->adjlist[i].data = i;
G->adjlist[i].firstedge = NULL;
}
// 添加边
int v1, v2, w;
EdgeNode* e1, * e2;
for (int i = 0; i < G->edgenum; i++) {
printf("输入第%d条边的两个顶点和权值(用空格隔开):", i + 1);
scanf("%d %d %d", &v1, &v2, &w);
// 添加边<v1, v2>
e1 = (EdgeNode*)malloc(sizeof(EdgeNode));
e1->adjvex = v2;
e1->weight = w;
e1->next = G->adjlist[v1].firstedge;
G->adjlist[v1].firstedge = e1;
// 添加边<v2, v1>
e2 = (EdgeNode*)malloc(sizeof(EdgeNode));
e2->adjvex = v1;
e2->weight = w;
e2->next = G->adjlist[v2].firstedge;
G->adjlist[v2].firstedge = e2;
}
}
// 深度优先遍历
void DFS(Graph* G, int v, int visited[]) {
printf("%d ", v); // 访问顶点v
visited[v] = 1; // 标记顶点v已访问
EdgeNode* p = G->adjlist[v].firstedge;
while (p != NULL) {
if (visited[p->adjvex] == 0) { // 如果邻接点未被访问
DFS(G, p->adjvex, visited); // 递归访问邻接点
}
p = p->next;
}
}
// 广度优先遍历
void BFS(Graph* G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM]; // 定义队列
int front = 0, rear = 0; // 队列头和尾指针
int w;
printf("%d ", v); // 访问顶点v
visited[v] = 1; // 标记顶点v已访问
queue[rear++] = v; // 将顶点v入队
while (front != rear) { // 队列不为空时
w = queue[front++]; // 出队一个顶点w
EdgeNode* p = G->adjlist[w].firstedge;
while (p != NULL) {
if (visited[p->adjvex] == 0) { // 如果邻接点未被访问
printf("%d ", p->adjvex); // 访问邻接点
visited[p->adjvex] = 1; // 标记邻接点已访问
queue[rear++] = p->adjvex; // 将邻接点入队
}
p = p->next;
}
}
}
int main() {
Graph G;
CreateGraph(&G);
// 初始化visited数组
int visited[MAX_VERTEX_NUM] = { 0 };
printf("深度优先遍历结果:");
DFS(&G, 0, visited);
printf("\n");
// 重新初始化visited数组
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("广度优先遍历结果:");
BFS(&G, 0, visited);
printf("\n");
return 0;
}
```
在该代码中,我们使用了邻接表来存储带权值无向图,并实现了图的深度优先遍历和广度优先遍历。在深度优先遍历中,我们使用递归的方式访问每个顶点的邻接点。在广度优先遍历中,我们使用队列来存储待访问的顶点,并按照广度优先的顺序依次访问它们的邻接点。
阅读全文