#include "stdafx.h"
#include <iostream.h>
#include <malloc.h>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//------------------------------------------------使用顺序表建立的队列结构------------------------------
int const maxsize=20;
typedef struct cycqueue
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int data[maxsize];
int front;
int rear;
}CycqueueTP;
//初始化队列,队列结构为保留一个结点作为标志,即front所在的点为标志点,不存储内容
void InitCycQueue(CycqueueTP & sq)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
sq.front=0;
sq.rear=0;
}
//入队,需要使用模除,用以实现循环
int EnCycQueue(CycqueueTP & sq,int value)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if ((sq.rear+1)%maxsize==sq.front)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//溢出
return 0;
}
sq.rear=(sq.rear+1)%maxsize;
sq.data[sq.rear]=value;
return 1;
}
//出队
int OutCycQueue(CycqueueTP & sq,int & value)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if (sq.front==sq.rear)
return 0; //空队列
sq.front=(sq.front+1)%maxsize;
value=sq.data[sq.front];
return 1;
}
//判断是否为空队列
int EmptyCycQueue(CycqueueTP & sq)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if (sq.front==sq.rear)
return 1;
else
return 0;
}
//-------------------------------------------------------------------------------------------
//邻接表,存储P114的5-10
int const vnum = 8;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//单链表定义
typedef struct arcnode
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int adjvex; //与其相连的下个结点的编号
struct arcnode * nextarc; //指向下一个结点的指针
}ArcNodeTp;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//头结点定义
typedef struct vexnode
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int vertex; //结点编号
ArcNodeTp * firstarc; //指向单链表的指针
}AdjList[vnum];
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//对此图的定义
typedef struct graph
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
AdjList adjlist; //头结点
int vexnum; //结点数
int arcnum; //边数
}GraphTp;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//建立一个新的结点
ArcNodeTp * CreateNewNode(int adjvex)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
ArcNodeTp * node=(ArcNodeTp *)malloc(sizeof(ArcNodeTp));
node->adjvex=adjvex;
node->nextarc=NULL;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return node;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//建立P114的5-10的无向图
void CreateGrapth(GraphTp & graph)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
graph.vexnum=7;
graph.arcnum=8;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ArcNodeTp * p=NULL;
int index=0;
//建立结点
index=0;
graph.adjlist[index].vertex=index;
p=CreateNewNode(1);
//修改头结点
graph.adjlist[index].firstarc=p;
//指向下一个结点
p->nextarc=CreateNewNode(2);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=1;
graph.adjlist[index].vertex=index;
p=CreateNewNode(3);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(4);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=2;
graph.adjlist[index].vertex=index;
p=CreateNewNode(5);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(6);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=3;
graph.adjlist[index].vertex=index;
p=CreateNewNode(1);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(7);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=4;
graph.adjlist[index].vertex=index;
p=CreateNewNode(1);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(7);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=5;
graph.adjlist[index].vertex=index;
p=CreateNewNode(2);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(6);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=6;
graph.adjlist[index].vertex=index;
p=CreateNewNode(2);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(5);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
index=7;
graph.adjlist[index].vertex=index;
p=CreateNewNode(3);
graph.adjlist[index].firstarc=p;
p->nextarc=CreateNewNode(4);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//广度优先算法
void Bfs(GraphTp graph,int value,int visited[])
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CycqueueTP queue;
InitCycQueue(queue);
cout<<"访问节点"<<value<<endl;
visited[value]=1;
EnCycQueue(queue,value);
while(!EmptyCycQueue(queue))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int v;
OutCycQueue(queue,v);
arcnode * node=graph.adjlist[v].firstarc;
while(node!=NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!visited[node->adjvex])
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<"访问节点"<<node->adjvex<<endl;
visited[node->adjvex]=1;
EnCycQueue(queue,node->adjvex);
}
node=node->nextarc;
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int main(int argc, char* argv[])
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int visited[vnum];
for(int i=0;i<vnum;i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
visited[i]=0;
}
GraphTp graph;
CreateGrapth(graph);
Bfs(graph,0,visited);
return 0;
}
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步