zoukankan      html  css  js  c++  java
  • 广度优先遍历算法

    广度优先遍历,这边就要涉及队列的处理,因为,我们一开始访问一个节点之后,访问跟这个结点直接相连的所有节点,这样相连的节点依次加入队列当中,保持队列的先进先出,每次出一个,再访问出的这个节点直接相连的节点,仍然依次进入队列当中。

    这边我们知道队列的最大元素的个数,这边采用循环队列的结构。

    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;
    }
  • 相关阅读:
    Springmvc+Easyui 搜索,新增,删除,修改
    重炉后-文件上传下载
    文件下载
    easyui-dialog里面的东西
    Mysql多表查询
    spring框架-spring.xml配置文件
    面向对象15.3String类-常见功能-判断
    面向对象15.3String类-常见功能-转换
    面向对象15.3String类-常见功能-获取-2
    面向对象15.3String类-常见功能-获取-1
  • 原文地址:https://www.cnblogs.com/fengbing/p/3580748.html
Copyright © 2011-2022 走看看