无向图的邻接表存储方式的广度优先遍历的实现

算法描述如下:
1)初始化一个数组visited标记节点是否被访问;
2)从第一个结点开始扫描图结点数组,如果对应的visited为false,则访问该结点,同时将标志设置为true,并将结点入队列;
3)访问对应结点的head直到NULL(表示结束),如果visited为false则访问,并入队列;若该结点访问完毕则出队列;
4)重复步骤3直到队列为空。
分析示例:
在这里插入图片描述
1)从第一个结点A开始访问并将标记设为true;
2)依次访问A的邻接点B、C、D,在访问过程中将相应的标记设为true;并将B、C、D入队列;此时A的邻接点访问完毕,A出队列,此时B的邻接点为D、F,访问完成之后队列中的数据为BCDF;此时B的邻接点访问完毕,出队列;
3)继续执行“出队列”和“访问头结点”两个步骤直到队列为空。算法执行结束。得到A->B->C->D->F->E就是我们要求的广度优先遍历的结果。
代码如下:

void GraphBfs(const PAdjGraph graph)
{
    
    
    if(graph == NULL) {
    
    
        perror("graph is null.");
        return;
    }
    int index = 0;
    PQueue queue = CreateQueue();
    PEdgeNode temp;
    for(int i=0; i<graph->nodeSize; i++) {
    
    
        visited[i] = false;
    }
    for(index =0; index<graph->nodeSize; index++) {
    
    
        if(!visited[index]) {
    
    
            visited[index] = true;
            printf("%c ", graph->node[index].data);
            InsertToQueueRear(queue, index);
            while(!QueueIsEmpty(queue)) {
    
    
                DeleteFromQueueFront(queue);
                temp = graph->node[index].head;
                while(temp != NULL) {
    
    
                    if(!visited[temp->data]) {
    
    
                        visited[temp->data] = true;
                        printf("%c ", graph->node[temp->data].data);
                        InsertToQueueRear(queue, temp->data);
                    }
                    temp = temp->next;
                }
            }
        }
    }
    return;
}

Guess you like

Origin blog.csdn.net/m0_37546257/article/details/121055996