#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 50 typedef struct { int data[MAX_VERTEX_NUM]; int front, rear; } Queue; void InitQueue(Queue *Q) { Q->front = Q->rear = 0; } int QueueEmpty(Queue Q) { return Q.front == Q.rear; } void EnQueue(Queue *Q, int x) { Q->data[Q->rear++] = x; } int DeQueue(Queue *Q) { return Q->data[Q->front++]; } typedef struct { int vex[MAX_VERTEX_NUM]; int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum, edgenum; } Graph; void CreateGraph(Graph *G) { int i, j; scanf("%d", &G->vexnum); for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) { scanf("%d", &G->edge[i][j]); } } } int FirstAdjVex(Graph G, int v) { int i; for (i = 0; i < G.vexnum; i++) { if (G.edge[v][i] == 1) { return i; } } return -1; } int NextAdjVex(Graph G, int v, int w) { int i; for (i = w + 1; i < G.vexnum; i++) { if (G.edge[v][i] == 1) { return i; } } return -1; } void BFS(Graph G, int v, int visited[]) { Queue Q; int w, i; InitQueue(&Q); visited[v] = 1; printf("%d ", v); EnQueue(&Q, v); while (!QueueEmpty(Q)) { w = DeQueue(&Q); for (i = FirstAdjVex(G, w); i != -1; i = NextAdjVex(G, w, i)) { if (!visited[i]) { visited[i] = 1; printf("%d ", i); EnQueue(&Q, i); } } } } void BFSTraverse(Graph G) { int visited[MAX_VERTEX_NUM] = {0}; int i; for (i = 0; i < G.vexnum; i++) { if (!visited[i]) { BFS(G, i, visited); } } } int main() { Graph G; CreateGraph(&G); BFSTraverse(G); printf("\n"); return 0; }上述代码的各个步骤都有什么用
时间: 2024-01-10 19:02:48 浏览: 66
#include <stdio.h>
这段代码是一个实现图的广度优先遍历算法的程序。下面是各个步骤的作用:
1. 定义队列结构体Queue,包含队列元素data和队首front、队尾rear指针。
2. 初始化队列操作InitQueue,将队首和队尾指针都初始化为0,表示队列为空。
3. 判断队列是否为空操作QueueEmpty,如果队首指针等于队尾指针,则队列为空。
4. 入队操作EnQueue,将元素x添加到队尾rear指向的位置,并将rear指针加1。
5. 出队操作DeQueue,返回队首front指向的元素,并将front指针加1。
6. 定义图结构体Graph,包含顶点vex、边edge、顶点数vexnum和边数edgenum。
7. 创建图操作CreateGraph,输入图的顶点数vexnum和邻接矩阵edge,存储在Graph结构体中。
8. 查找顶点v的第一个邻接顶点操作FirstAdjVex,从v的第一个邻接顶点开始遍历邻接矩阵edge,返回第一个邻接顶点的位置。
9. 查找顶点v的下一个邻接顶点操作NextAdjVex,从w+1开始遍历邻接矩阵edge,返回下一个邻接顶点的位置。
10. 广度优先遍历操作BFS,从顶点v开始遍历图,使用队列实现遍历过程,访问每个未被访问的邻接顶点,将其放入队列中。
11. 广度优先遍历操作BFSTraverse,对整个图进行广度优先遍历,使用visited数组记录每个顶点是否已被访问。
12. 主函数main,创建图G并进行广度优先遍历。
阅读全文