用C语言写邻接矩阵的广度遍历代码
时间: 2024-02-13 19:02:23 浏览: 82
邻接矩阵广度优先遍历.cpp
好的,以下是用C语言写邻接矩阵的广度遍历代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 边表结点
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的位置
struct ArcNode *next; // 指向下一条边的指针
}ArcNode;
// 顶点表结点
typedef struct {
char data; // 顶点的数据
ArcNode *firstarc; // 指向第一条依附该顶点的边的指针
}VNode, AdjList[MAX_VERTEX_NUM];
// 图的结构体
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图的当前顶点数和边数
}ALGraph;
// 初始化邻接表
void InitGraph(ALGraph *G) {
int i;
G->vexnum = G->arcnum = 0;
for(i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].firstarc = NULL;
}
}
// 插入边
void InsertArc(ALGraph *G, int v, int w) {
ArcNode *p;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = w;
p->next = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
G->arcnum++;
}
// 广度遍历
void BFSTraverse(ALGraph G, int v) {
int i, visited[MAX_VERTEX_NUM] = {0}, queue[MAX_VERTEX_NUM], front = 0, rear = 0;
ArcNode *p;
printf("%c ", G.vertices[v].data);
visited[v] = 1;
queue[rear++] = v;
while(front != rear) {
v = queue[front++];
for(p = G.vertices[v].firstarc; p != NULL; p = p->next) {
i = p->adjvex;
if(!visited[i]) {
printf("%c ", G.vertices[i].data);
visited[i] = 1;
queue[rear++] = i;
}
}
}
}
int main() {
ALGraph G;
int i, j;
char c;
InitGraph(&G);
printf("请输入顶点信息(以#结束):\n");
for(i = 0; (c = getchar()) != '#'; i++) {
G.vertices[i].data = c;
G.vexnum++;
}
getchar(); // 吃掉回车符
printf("请输入边的信息(以# #结束):\n");
while(scanf("%d %d", &i, &j) == 2) {
InsertArc(&G, i, j);
}
printf("广度遍历序列为:\n");
BFSTraverse(G, 0);
printf("\n");
return 0;
}
```
在这段代码中,我们定义了 `ArcNode` 和 `VNode` 两个结构体,分别表示边表结点和顶点表结点。然后,我们定义了 `ALGraph` 结构体来表示图,其中包括邻接表、顶点数和边数。接着,我们实现了 `InitGraph` 和 `InsertArc` 函数,分别用来初始化邻接表和插入边。最后,我们实现了 `BFSTraverse` 函数,用来进行广度遍历。在 `BFSTraverse` 函数中,我们使用了一个队列来存储待遍历的顶点,使用了一个 `visited` 数组来记录顶点是否被访问过,并且使用了一个 `front` 变量和一个 `rear` 变量来记录队列的头和尾。
阅读全文