用C语言在有向图的邻接表存储结构基础上对图进行广度优先搜索遍历并输出顶点序列并举例
时间: 2024-02-13 10:00:56 浏览: 76
好的,我知道了。以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 边表结点
typedef struct ArcNode {
int adjvex; // 邻接点
struct ArcNode *next; // 下一条边
} ArcNode;
// 顶点表结点
typedef struct VertexNode {
int data; // 顶点信息
ArcNode *firstarc; // 第一条边
} VertexNode, AdjList[MAX_VERTEX_NUM];
// 邻接表存储的图结构
typedef struct {
AdjList vertices; // 顶点表
int vexnum, arcnum; // 顶点数和弧数
} ALGraph;
// 初始化邻接表
void InitALGraph(ALGraph *G) {
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].firstarc = NULL;
}
}
// 添加边
void AddArc(ALGraph *G, int v, int w) {
ArcNode *p = (ArcNode*) malloc(sizeof(ArcNode));
p->adjvex = w;
p->next = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
}
// 广度优先搜索遍历
void BFS(ALGraph *G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
ArcNode *p;
visited[v] = 1;
printf("%d ", G->vertices[v].data);
queue[rear++] = v;
while (front != rear) {
int w = queue[front++];
for (p = G->vertices[w].firstarc; p; p = p->next) {
int u = p->adjvex;
if (!visited[u]) {
visited[u] = 1;
printf("%d ", G->vertices[u].data);
queue[rear++] = u;
}
}
}
}
int main() {
ALGraph G;
int visited[MAX_VERTEX_NUM] = {0};
int i;
// 初始化图
InitALGraph(&G);
// 添加顶点
for (i = 0; i < 6; i++) {
G.vertices[i].data = i + 1;
G.vexnum++;
}
// 添加边
AddArc(&G, 0, 1);
AddArc(&G, 0, 2);
AddArc(&G, 1, 3);
AddArc(&G, 1, 4);
AddArc(&G, 2, 4);
AddArc(&G, 3, 5);
AddArc(&G, 4, 5);
G.arcnum = 7;
// 广度优先搜索遍历
BFS(&G, 0, visited);
return 0;
}
```
以上代码实现了一个有向图的广度优先搜索遍历,并输出了顶点序列。图的邻接表存储结构使用了顶点表和边表两个结构体,其中顶点表用于存储顶点信息和第一条边,边表用于存储邻接点信息和下一条边。在 BFS 函数中,使用了一个队列来辅助遍历,每次从队列头部取出一个顶点,将其未访问的邻接点加入队列尾部,并输出顶点序列。
阅读全文