用c语言写一个对邻接表表示的无向图进行广度优先遍历 1、顶点标志数组visited[],数组存放成员TRUE,FALSE。 初始化为FALSE,其中TRUE表示已经访问过。 2、从初始位置顶点开始,遍历所有的邻接顶点并将其加入队列, 当一个顶点的所有邻接点都遍历完了之后就把该顶点出队列, 拿出下一个顶点,然后不断的重复该过程 3、遍历结束后调用换行函数 4、换行: 调用函数 void LineFeed() 数据打印: 调用函数 void PVisit(ElemType data) 参数说明:AlGraph *G 图的指针 返回值: void
时间: 2024-03-21 20:39:57 浏览: 96
下面是用C语言实现对邻接表表示的无向图进行广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 邻接表存储结构定义
typedef struct ArcNode {
int adjvex; // 邻接点下标
struct ArcNode *next; // 下一个邻接点指针
} ArcNode;
typedef struct VNode {
char data; // 顶点信息
ArcNode *first; // 第一个邻接点指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
} AlGraph;
// 初始化邻接表
void CreateGraph(AlGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar(); // 吸收回车
printf("请输入%d个顶点信息:\n", G->vexnum);
for (i = 0; i < G->vexnum; i++) {
printf("第%d个顶点:", i + 1);
scanf("%c", &G->vertices[i].data);
getchar(); // 吸收回车
G->vertices[i].first = NULL;
}
printf("请输入%d条边的顶点序号:\n", G->arcnum);
for (k = 0; k < G->arcnum; k++) {
printf("第%d条边:", k + 1);
scanf("%d%d", &i, &j);
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j - 1;
p->next = G->vertices[i - 1].first;
G->vertices[i - 1].first = p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i - 1;
p->next = G->vertices[j - 1].first;
G->vertices[j - 1].first = p;
}
}
// 遍历操作
void PVisit(int v) {
printf("%c ", 'A' + v);
}
// 广度优先遍历
void BFS(AlGraph *G) {
int i, v, w;
ArcNode *p;
int visited[MAX_VERTEX_NUM] = {0}; // 标志数组初始化为0
int Q[MAX_VERTEX_NUM], front = 0, rear = 0; // 队列初始化
printf("广度优先遍历序列:");
for (i = 0; i < G->vexnum; i++) {
if (!visited[i]) { // 如果该顶点未被访问过
visited[i] = 1; // 标记已访问
PVisit(i); // 访问该顶点
Q[++rear] = i; // 入队
while (front != rear) { // 当队列非空时
v = Q[++front]; // 出队
p = G->vertices[v].first;
while (p) {
w = p->adjvex;
if (!visited[w]) { // 如果该顶点未被访问过
visited[w] = 1; // 标记已访问
PVisit(w); // 访问该顶点
Q[++rear] = w; // 入队
}
p = p->next;
}
}
}
}
printf("\n");
}
// 主函数
int main() {
AlGraph G;
CreateGraph(&G);
BFS(&G);
return 0;
}
```
在这个程序中,我们定义了一个结构体 `ArcNode` 表示邻接点,定义了一个结构体 `VNode` 表示顶点,定义了一个结构体 `AlGraph` 表示邻接表存储的图。`CreateGraph` 函数用于创建邻接表,`BFS` 函数用于进行广度优先遍历,`PVisit` 函数用于遍历操作。在 `BFS` 函数中,我们使用一个标志数组 `visited` 来标记每个顶点是否被访问过,使用一个队列 `Q` 来存储待访问的顶点。首先遍历每个连通分量,如果该顶点未被访问过,则进行广度优先遍历,并将访问过的顶点标记为已访问。在遍历每个顶点的邻接点时,如果邻接点未被访问过,则将其加入队列中,同时标记为已访问。当队列为空时,说明该连通分量已经遍历完毕,继续遍历下一个连通分量,直到所有顶点都被访问过为止。
阅读全文