以连接矩阵为储存单位,采用广度优先遍历算法遍历图,需要C语言代码
时间: 2023-06-12 16:04:42 浏览: 84
深度优先算法,图的遍历(c语言)
以下是基于邻接矩阵的广度优先遍历算法的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 图中最大顶点数
#define MAX_QUEUE_SIZE 100 // 队列最大容量
typedef int VertexType; // 顶点数据类型
typedef int EdgeType; // 边权值数据类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 存储顶点信息
EdgeType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边权值信息
int numVertexes, numEdges; // 图中当前顶点数和边数
} MGraph;
typedef struct {
int data[MAX_QUEUE_SIZE]; // 存储队列元素
int front, rear; // 队头和队尾指针
} Queue;
void InitQueue(Queue *q) {
q->front = q->rear = 0;
}
int IsEmpty(Queue *q) {
return q->front == q->rear;
}
int IsFull(Queue *q) {
return (q->rear + 1) % MAX_QUEUE_SIZE == q->front;
}
void EnQueue(Queue *q, int i) {
if (IsFull(q)) {
printf("Queue is full.\n");
exit(1);
}
q->data[q->rear] = i;
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
}
int DeQueue(Queue *q) {
if (IsEmpty(q)) {
printf("Queue is empty.\n");
exit(1);
}
int i = q->data[q->front];
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return i;
}
// 创建无向图的邻接矩阵表示
void CreateMGraph(MGraph *G) {
scanf("%d %d", &G->numVertexes, &G->numEdges);
for (int i = 0; i < G->numVertexes; i++) {
scanf("%d", &G->vexs[i]);
}
for (int i = 0; i < G->numVertexes; i++) {
for (int j = 0; j < G->numVertexes; j++) {
G->edges[i][j] = 0;
}
}
for (int k = 0; k < G->numEdges; k++) {
int i, j;
scanf("%d %d", &i, &j);
G->edges[i][j] = G->edges[j][i] = 1;
}
}
// 输出图的邻接矩阵表示
void PrintMGraph(MGraph G) {
printf("Matrix Graph:\n");
for (int i = 0; i < G.numVertexes; i++) {
for (int j = 0; j < G.numVertexes; j++) {
printf("%d ", G.edges[i][j]);
}
printf("\n");
}
}
// 广度优先遍历
void BFSTraverse(MGraph G, int v) {
int visited[MAX_VERTEX_NUM] = {0}; // 标记顶点是否被访问过
Queue q;
InitQueue(&q);
visited[v] = 1;
printf("%d ", G.vexs[v]);
EnQueue(&q, v);
while (!IsEmpty(&q)) {
int i = DeQueue(&q);
for (int j = 0; j < G.numVertexes; j++) {
if (G.edges[i][j] == 1 && visited[j] == 0) {
visited[j] = 1;
printf("%d ", G.vexs[j]);
EnQueue(&q, j);
}
}
}
}
int main() {
MGraph G;
CreateMGraph(&G);
PrintMGraph(G);
printf("BFS Traversal:\n");
BFSTraverse(G, 0);
return 0;
}
```
其中,`MGraph`结构体表示图的邻接矩阵存储方式,`Queue`结构体表示队列。`CreateMGraph`函数用于创建无向图的邻接矩阵表示,`PrintMGraph`函数用于输出图的邻接矩阵表示,`BFSTraverse`函数用于进行广度优先遍历。在`main`函数中,先创建图,然后输出邻接矩阵表示和进行广度优先遍历。
阅读全文