以邻接表的存储方式,用c语言实现无向图的BFS和DFS遍历,输入遍历开始的起点
时间: 2024-03-12 07:44:49 浏览: 75
无向图的邻接表构建和遍历
5星 · 资源好评率100%
好的,以下是使用邻接表表示无向图的BFS和DFS遍历的C语言代码。其中,我们假设图中的节点编号从0开始。代码中的注释会帮助您理解算法的实现细节。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大节点数
/* 邻接表节点结构体 */
typedef struct ArcNode{
int adjvex; // 邻接点编号
struct ArcNode* nextarc; // 下一个邻接点指针
}ArcNode;
/* 顶点节点结构体 */
typedef struct VertexNode{
int data; // 顶点数据
ArcNode* firstarc; // 第一个邻接点指针
}VertexNode;
/* 图结构体 */
typedef struct{
VertexNode vexs[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
int arcnum; // 边数
}Graph;
/* 初始化图 */
void InitGraph(Graph* G){
int i;
G->vexnum = 0;
G->arcnum = 0;
for(i = 0; i < MAX_VERTEX_NUM; i++){
G->vexs[i].data = 0;
G->vexs[i].firstarc = NULL;
}
}
/* 插入边 */
void InsertArc(Graph* G, int v1, int v2){
ArcNode* p1 = (ArcNode*)malloc(sizeof(ArcNode));
ArcNode* p2 = (ArcNode*)malloc(sizeof(ArcNode));
p1->adjvex = v2;
p2->adjvex = v1;
p1->nextarc = G->vexs[v1].firstarc;
p2->nextarc = G->vexs[v2].firstarc;
G->vexs[v1].firstarc = p1;
G->vexs[v2].firstarc = p2;
G->arcnum++;
}
/* BFS遍历 */
void BFS(Graph* G, int start){
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有节点未被访问
int queue[MAX_VERTEX_NUM]; // 队列
int front = 0; // 队头
int rear = 0; // 队尾
int i, j;
ArcNode* p;
visited[start] = 1; // 标记起始节点已被访问
printf("%d ", start); // 输出起始节点
queue[rear++] = start; // 起始节点入队
while(front < rear){ // 队列不为空则循环
i = queue[front++]; // 出队
p = G->vexs[i].firstarc; // 获取第一个邻接点
while(p){ // 遍历邻接点
j = p->adjvex;
if(!visited[j]){ // 如果邻接点未被访问则访问并标记
visited[j] = 1;
printf("%d ", j);
queue[rear++] = j; // 邻接点入队
}
p = p->nextarc; // 处理下一个邻接点
}
}
}
/* DFS遍历 */
void DFS(Graph* G, int i, int visited[]){
ArcNode* p = G->vexs[i].firstarc; // 获取第一个邻接点
visited[i] = 1; // 标记节点已被访问
printf("%d ", i); // 输出节点
while(p){ // 遍历邻接点
if(!visited[p->adjvex]){ // 如果邻接点未被访问则递归访问
DFS(G, p->adjvex, visited);
}
p = p->nextarc; // 处理下一个邻接点
}
}
int main(){
Graph G;
int start;
int i, j;
printf("请输入无向图的节点数和边数:");
scanf("%d%d", &G.vexnum, &G.arcnum);
printf("请依次输入每个节点的数据:");
for(i = 0; i < G.vexnum; i++){
scanf("%d", &(G.vexs[i].data));
}
printf("请依次输入每条边的两个节点编号(从0开始):\n");
for(i = 0; i < G.arcnum; i++){
scanf("%d%d", &j, &start);
InsertArc(&G, j, start);
}
printf("请输入遍历开始的节点编号(从0开始):");
scanf("%d", &start);
printf("BFS遍历结果为:");
BFS(&G, start);
printf("\nDFS遍历结果为:");
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有节点未被访问
DFS(&G, start, visited);
return 0;
}
```
希望这份代码能够帮到您!
阅读全文