代码如下:
#include<iostream>
#define MaxVertexNum 6 //定义图中最大节点的个数
typedef int VertexType;
using namespace std;
bool visited[6];//访问标记数组
typedef struct
{
VertexType Que[100];
int front, rear;
}Queue;
bool IsEmpty(Queue Q)
{
if (Q.front == Q.rear)
{
return true;
}
else
{
return false;
}
}
void InitQueue(Queue& Q)
{
Q.front = Q.rear=0;
};
void EnQueue(Queue& Q,int x)
{
Q.Que[Q.rear++] = x;
}
void DeQueue(Queue& Q)
{
if (!IsEmpty(Q))
{
printf("%d",Q.Que[Q.front++]);
}
}
//定义单链表节点的结构体
typedef struct ArcNode { /* 清华教材书上与王道书上都没有具体给出这个结构体究竟想干个啥,
仅仅说的边表,实际上这里定义每一个单链表中的节点的结构体(邻接表法:图有多少个节点就有多少个单链表) */
int adjvex; //该节点的值,就是与该单链表中顶点相连的节点的值
struct ArcNode* next; //指向单链表的下一个节点
//InfoType info;
}ArcNode;
//邻接表法还要找一个顶点表,用来存储图的所有节点
typedef struct VNode {
VertexType data; //顶点的值
ArcNode* first; //顶点相当于单链表的第一个节点,因此取名为first
}VNode,AdjList[MaxVertexNum]; //此处已经解释过,为啥定义为数组形式,就是为了存储100个节点的结构体
//单链表有了,顶点表有了,最后封装起来,定义为图,就大功告成
typedef struct {
AdjList Vertices; //这里也解释过了
int vexnum, arcnum; //记录整个图的节点个数,记录整个图的边个数
}ALGraphy; //定义为邻接表形式的图
void BFS(ALGraphy G, int v,Queue &Q)
{
visited[v] = true;
EnQueue(Q, v+1);
while (!IsEmpty(Q))
{
DeQueue(Q);
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p = G.Vertices[v].first;
while (p != NULL)
{
if (!visited[p->adjvex - 1])
{
EnQueue(Q, p->adjvex);
visited[p->adjvex - 1] = true;
}
p = p->next;
}
v = Q.Que[Q.front]-1;
}
}
void BFSTraverse(ALGraphy G)
{
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = false; //初始化未被访问,置为false;
}
Queue Q;
InitQueue(Q);
for (int i = 0; i < G.vexnum; i++)
{
if (!visited[i])
{
BFS(G, i,Q);
}
}
}
int main()
{
ALGraphy Graphy;
//图中有6个节点,8条边,意味着顶点表有6个元素,先循环赋值一波
Graphy.vexnum = 6;
Graphy.arcnum = 8;
for (int i = 0; i < 6; i++)
{
Graphy.Vertices[i].data = i + 1; //先把6个顶点的值装进顶点表中
Graphy.Vertices[i].first = NULL; //全部置为空
}
//接下来构建每个节点的单链表了
//先讨论顶点1,它有向指向2与4
Graphy.Vertices[0].first = (ArcNode*)malloc(sizeof(ArcNode)); //先为顶点1申请空间
Graphy.Vertices[0].first->adjvex =2;
Graphy.Vertices[0].first->next = (ArcNode*)malloc(sizeof(ArcNode));
Graphy.Vertices[0].first->next->adjvex = 4;
Graphy.Vertices[0].first->next->next = NULL;
//再讨论顶点2,它有向指向顶点5
Graphy.Vertices[1].first = (ArcNode*)malloc(sizeof(ArcNode));
Graphy.Vertices[1].first->adjvex = 5;
Graphy.Vertices[1].first->next = NULL;
//讨论顶点3,它有向指向6,5
Graphy.Vertices[2].first = (ArcNode*)malloc(sizeof(ArcNode)); //先为顶点1申请空间
Graphy.Vertices[2].first->adjvex = 6;
Graphy.Vertices[2].first->next = (ArcNode*)malloc(sizeof(ArcNode));
Graphy.Vertices[2].first->next->adjvex = 5;
Graphy.Vertices[2].first->next->next = NULL;
//讨论顶点4,它有向指向顶点2
Graphy.Vertices[3].first = (ArcNode*)malloc(sizeof(ArcNode));
Graphy.Vertices[3].first->adjvex = 2;
Graphy.Vertices[3].first->next = NULL;
//讨论顶点5,它有向指向顶点4
Graphy.Vertices[4].first = (ArcNode*)malloc(sizeof(ArcNode));
Graphy.Vertices[4].first->adjvex = 4;
Graphy.Vertices[4].first->next = NULL;
//讨论顶点6,它有向指向顶点6
Graphy.Vertices[5].first = (ArcNode*)malloc(sizeof(ArcNode));
Graphy.Vertices[5].first->adjvex = 6;
Graphy.Vertices[5].first->next = NULL;
printf("该有向图广度优先遍历的结果为:");
BFSTraverse(Graphy);
}
此代码实现的是邻接表形式的广度优先遍历,这里我画的是有向图,也可以拿来实现无向图的遍历,只用修改图的邻接表就行了。