图的广度优先遍历::邻接矩阵+队列.

之前用队列的时候,实现方式很简陋:一维数组+两个指针。现在先规范的写出队列的所有函数的算法,然后放到一个头文件中,直接调用函数。一开始很不习惯,主要是以前编程都是等到要什么功能的函数就地编写。后来看到C++中一些关于代码重用的说法,再想想自己确实写了很多功能相似的函数也即做了很多无用功。于是狠下心来,把数据结构中存储结构的函数功能和经常使用的一些函数都实现,放到头文件中,以后直接调用。

其实广度优先的原理都是一样的(迷宫的广度,二叉树的层序……),就是用队列,然后不停的将与要出队的结点有关联的结点入队(这个有点难说明白,表达能力有待提高……),直到队空。


//图:邻接矩阵:广度优先遍历
#include<iostream>
#include<cstdlib>
using namespace std;
#include"Queue.h" // 队列

const int size=9;

struct ArcCell{
	bool Matrix[size][size]; //邻接矩阵
	int VexNum;  //图的顶点数
};
struct ArcCell G;
bool sign[size];

void BreFirst(struct Queue &Q);
int main()
{
    const int sidenum=14;
    int map[sidenum][2]={{0,1},{0,5},{1,2},{1,8},
                    {1,6},{2,3},{2,8},{3,4},
                    {3,7},{3,8},{4,5},{4,7},
                    {5,6},{6,7}};
    for(int i=0;i<sidenum;i++)
        G.Matrix[map[i][0]][map[i][1]]=TRUE;
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
            cout<<G.Matrix[i][j]<<' ';
        cout<<endl;
    }
    cout<<endl;
    for(int i=0;i<size;i++)
        sign[i]=FALSE;
    struct Queue Q;
    IniQueue(Q);
    int i=0;
    InQueue(Q,i);
    sign[i]=TRUE;
    for(;i<size;i++)
        BreFirst(Q);
    DestroyQueue(Q);
    return 0;
}
void BreFirst(struct Queue &Q)
{
    if(QueueEmpty(Q)) return;
    int tmp;
    OutQueue(Q,tmp);
    cout<<tmp<<' ';
    for(int j=0;j<size;j++)
        if(G.Matrix[tmp][j]==TRUE
                  &&sign[j]==FALSE)
                  {
                      InQueue(Q,j);
                      sign[j]=TRUE;
                  }
}



//数据结构:队列
#include<iostream>
using namespace std;
typedef int DataType;
const int FIRSTSIZE=100;
const bool TRUE=1;
const bool FALSE=0;
struct Queue
{
    DataType *data;
    int length;    //已存数据个数
	int size_;      //可存数据个数
};
void IniQueue(struct Queue &Q); //构造空队列
void DestroyQueue(struct Queue &Q); //销毁队列
bool InQueue(struct Queue &Q,DataType &data);
bool OutQueue(struct Queue &Q,DataType &data);
bool QueueEmpty(struct Queue &Q);
void IniQueue(struct Queue &Q)
{
    Q.data=new DataType [FIRSTSIZE];
    Q.length=0;
    Q.size_=FIRSTSIZE;
}
void DestroyQueue(struct Queue &Q)
{
    if(!Q.data) return;
    delete [] Q.data;
    Q.data=NULL;
    Q.length=0;
    Q.size_=0;
}
bool InQueue(struct Queue &Q,DataType &data)
{
    if(Q.length==FIRSTSIZE)
        return FALSE;
    Q.data[Q.length]=data;
    ++Q.length;
    return TRUE;
}
bool OutQueue(struct Queue &Q,DataType &data)
{
    if(Q.length==0)
        return FALSE;
    data=Q.data[0];
    --Q.length;
    for(int i=0;i<Q.length;i++)
        Q.data[i]=Q.data[i+1];
    return TRUE;
}
bool QueueEmpty(struct Queue &Q)
{
    if(Q.length==0)
        return TRUE;
    else
        return FALSE;
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/liu2614332/article/details/17889263
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞