广度优先遍历,这边就要涉及队列的处理,因为,我们一开始访问一个节点之后,访问跟这个结点直接相连的所有节点,这样相连的节点依次加入队列当中,保持队列的先进先出,每次出一个,再访问出的这个节点直接相连的节点,仍然依次进入队列当中。
这边我们知道队列的最大元素的个数,这边采用循环队列的结构。
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}Queue;
给出队列的入队,出队操作。
int enQueue(Queue *q,int e)
{
if((q->rear+1)%MAXSIZE==q->front)
{
return 0;
}
q->data[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
return 1;
}
int deQueue(Queue *q,int *e)
{
if(q->front==q->rear)
return 0;
*e=q->data[q->front];
q->front=(q->front+1)%MAXSIZE;
return 1;
}
给出整个代码:
#include <stdio.h> #define MAXVEX 9 #define INFINITY 65535 #define MAXSIZE 9 //队列最大储存 typedef struct MGraph { char vexs[MAXVEX]; int arc[MAXVEX][MAXVEX]; int numVertexes, numEdges; }MGraph; typedef struct { int data[MAXSIZE]; int front; int rear; }Queue; int visited[MAXVEX]; int initQueue(Queue *q); int queueEmpty(Queue q); int enQueue(Queue *q,int e); int deQueue(Queue *q,int *e); void createMGraph(MGraph *g); void BFSTraverse(MGraph g); int initQueue(Queue *q) { q->front=0; q->rear=0; return 1; } int queueEmpty(Queue q) { if(q.front==q.rear) return 1; else return 0; } int enQueue(Queue *q,int e) { if((q->rear+1)%MAXSIZE==q->front) { return 0; } q->data[q->rear]=e; q->rear=(q->rear+1)%MAXSIZE; return 1; } int deQueue(Queue *q,int *e) { if(q->front==q->rear) return 0; *e=q->data[q->front]; q->front=(q->front+1)%MAXSIZE; return 1; } void createMGraph(MGraph *g) { int i, j; g->numEdges=15; g->numVertexes=9; g->vexs[0]='A'; g->vexs[1]='B'; g->vexs[2]='C'; g->vexs[3]='D'; g->vexs[4]='E'; g->vexs[5]='F'; g->vexs[6]='G'; g->vexs[7]='H'; g->vexs[8]='I'; for (i = 0; i < g->numVertexes; i++) { for ( j = 0; j < g->numVertexes; j++) { g->arc[i][j]=0; } } g->arc[0][1]=1; g->arc[0][5]=1; g->arc[1][2]=1; g->arc[1][8]=1; g->arc[1][6]=1; g->arc[2][3]=1; g->arc[2][8]=1; g->arc[3][4]=1; g->arc[3][7]=1; g->arc[3][6]=1; g->arc[3][8]=1; g->arc[4][5]=1; g->arc[4][7]=1; g->arc[5][6]=1; g->arc[6][7]=1; for(i = 0; i < g->numVertexes; i++) { for(j = i; j < g->numVertexes; j++) { g->arc[j][i] =g->arc[i][j]; } } } void BFSTraverse(MGraph g) { int i,j; Queue q; for(i=0;i<g.numVertexes;i++) visited[i] = 0; initQueue(&q); for(i=0;i<g.numVertexes;i++) { if(visited[i]!=1) { visited[i]=1; printf("%c ",g.vexs[i]); enQueue(&q,i); while(!queueEmpty(q)) { deQueue(&q,&i); for(j=0;j<g.numVertexes;j++) { if(g.arc[i][j]==1&& visited[j]!=1) { visited[j]=1; printf("%c ",g.vexs[j]); enQueue(&q,j); } } } } } } int main() { MGraph g; createMGraph(&g); BFSTraverse(g); return 0; }
来源:https://www.cnblogs.com/fengbing/p/3580748.html