一、广度优先遍历
广度优先遍历是点,利用队列,思想是这样的。对于第一个点,先是搜索所有与之为邻边的所有的点进队列,然后出队列,重复操作,直至遍历完所有点。
二、数据结构和算法
1、队列
略,参考我之前写的队列。
2、算法
//======================广度优先遍历===============
void BFSTraverse_L(OLGraph G){
//初始化visited数组
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = false;
}
SqQueue queue;//顺序队列
InitQueue_Sq(queue);//初始化队列
for (int i = 0; i < G.vexnum; i++)
{
if (visited[i] == false)
{
//对没有访问的点访问并进队列
visited[i] = true;
printf("%c",G.xlist[i].data);
EnQueue_Sq(queue,i); //从i这个点开始广度遍历
while (!IsQueueEmpty_Sq(queue))
{
int w;
DeQueue_Sq(queue, w);//返回w这个索引
//进入到下一个结点, 如果下一个结点没有被访问过则进行 寻找所有的邻边访问并进队列
ArcBox * arc = G.xlist[w].firstout;
while (arc != NULL)
{
//这个结点有邻接点的情况
int w = arc->headvex;
if (visited[w] == false)
{
//没有访问过的结点进行访问
visited[w] = true;
printf("%c", G.xlist[w].data);
EnQueue_Sq(queue, w);
}
//进入下一跳邻边
arc = arc->tlink;
}
}
}
}
}
三、操作
//用十字链表创建一个有向图P165
int vexnum = 4;
char *vexs = "abcd";
int arcnum = 7;
int maps[4][4] = {
{ 0, 1, 1, 0 },
{ 0, 0, 0, 0 },
{ 1, 0, 0, 1 },
{ 1, 1, 1, 0 },
};
OLGraph G;
CreateDG(G,vexnum,vexs,arcnum,maps);
//PrintfGraphDg(G);
//DFSTraverse_L(G);
BFSTraverse_L(G);
输出:
acbd请按任意键继续. . .