用c语言对邻接表表示的无向图进行广度优先遍历 1、顶点标志数组visited[],数组存放成员TRUE,FALSE。 初始化为FALSE,其中TRUE表示已经访问过。 2、从初始位置顶点开始,遍历所有的邻接顶点并将其加入队列, 当一个顶点的所有邻接点都遍历完了之后就把该顶点出队列, 拿出下一个顶点,然后不断的重复该过程 3、遍历结束后调用换行函数 4、换行: 调用函数 void LineFeed() 数据打印: 调用函数 void PVisit(ElemType data) 参数说明:AlGraph *G 图的指针 返回值: void
时间: 2024-02-22 07:55:43 浏览: 77
编程将若干结点组成的无向图用邻接链表存入计算机,并广度遍历输出该图。
5星 · 资源好评率100%
以下是用C语言对邻接表表示的无向图进行广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
// 邻接点结构体
typedef struct ArcNode {
int adjvex; // 邻接点在数组中的位置下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
// 顶点结构体
typedef struct VNode {
ElemType data; // 顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 图结构体
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
} AlGraph;
// 初始化图
Status InitGraph(AlGraph *G) {
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].data = 0;
G->vertices[i].firstarc = NULL;
}
return TRUE;
}
// 添加顶点
Status AddVertex(AlGraph *G, ElemType data) {
if (G->vexnum >= MAX_VERTEX_NUM) {
return FALSE;
}
G->vertices[G->vexnum].data = data;
G->vexnum++;
return TRUE;
}
// 添加边
Status AddEdge(AlGraph *G, int v1, int v2) {
if (v1 < 0 || v1 >= G->vexnum || v2 < 0 || v2 >= G->vexnum) {
return FALSE;
}
ArcNode *p1 = (ArcNode *) malloc(sizeof(ArcNode));
p1->adjvex = v2;
p1->nextarc = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p1;
ArcNode *p2 = (ArcNode *) malloc(sizeof(ArcNode));
p2->adjvex = v1;
p2->nextarc = G->vertices[v2].firstarc;
G->vertices[v2].firstarc = p2;
G->arcnum++;
return TRUE;
}
// 广度优先遍历
void BFS(AlGraph *G) {
int i, j, k;
int visited[MAX_VERTEX_NUM]; // 顶点标志数组
for (i = 0; i < G->vexnum; i++) {
visited[i] = FALSE;
}
for (i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
visited[i] = TRUE;
printf("%d ", G->vertices[i].data);
int queue[MAX_VERTEX_NUM]; // 存放顶点下标的队列
int front = 0, rear = 0;
queue[rear++] = i;
while (front != rear) {
j = queue[front++];
for (k = 0; k < G->vexnum; k++) {
if (!visited[k] && G->vertices[j].firstarc != NULL) {
ArcNode *p = G->vertices[j].firstarc;
while (p != NULL) {
if (p->adjvex == k) {
visited[k] = TRUE;
printf("%d ", G->vertices[k].data);
queue[rear++] = k;
break;
}
p = p->nextarc;
}
}
}
}
}
}
printf("\n");
}
// 主函数
int main() {
AlGraph G;
InitGraph(&G);
AddVertex(&G, 1);
AddVertex(&G, 2);
AddVertex(&G, 3);
AddVertex(&G, 4);
AddVertex(&G, 5);
AddEdge(&G, 0, 1);
AddEdge(&G, 0, 2);
AddEdge(&G, 0, 3);
AddEdge(&G, 1, 4);
AddEdge(&G, 2, 4);
AddEdge(&G, 3, 4);
BFS(&G);
return 0;
}
```
这段代码实现了一个无向图的广度优先遍历,先初始化顶点和边,然后从每个未访问的顶点开始,遍历其所有邻接点并将其加入队列,当一个顶点的所有邻接点都遍历完了之后就把该顶点出队列,拿出下一个顶点,然后不断的重复该过程,直到所有顶点都被访问过。
阅读全文