广度优先搜索遍历连通图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
韩山师范学院
实验题目:
用邻接表实现广度优先搜索遍历连通图的算法实现
班级:2015级软工班作者:黄俊聪
#include
using namespace std;
#define MVNum 100//最大顶点数
#define OK 1
#define ERROR 0
typedefint Status;
typedef char VerTexType;
typedefintOtherInfo;
bool visited[MVNum];
typedefstructArcNode//边结点
{
intadjvex;//该边所指向的顶点的位置
structArcNode* nextarc;//指向下一条边的指针
OtherInfo info;//和边相关的信息
}ArcNode;
typedefstructVNode//顶点信息
{
VerTexType data;
ArcNode* firstarc;//指向第一条依附该顶点的边的指针}VNode,AdjList[MVNum];//Adjlist表示邻接表类型
typedefstruct
{
AdjList vertices;
intvexnum,arcnum;//图的当前顶点数
}ALGraph;
typedefstructQNode
{
char data;
structQNode* next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue& Q)
{
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
}
Status EnQueue(LinkQueue&Q,int e)
{
QueuePtr p;
p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Status QueueEmpty(LinkQueue& Q) {
if(Q.front==Q.rear)
return OK;
else
return ERROR;
}
charDeQueue(LinkQueue&Q,int& e) {
QueuePtr p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
delete p;
return OK;
}
Status LocateVex(ALGraphG,char v) {
int i;
for(int i=0;i if(G.vertices[i].data==v) return i; return ERROR; } Status CreateUDG(ALGraph& G) { ArcNode* p1,*p2; char v1,v2; inti,j; cout<<"输入总顶点数和总边数:"< cin>>G.vexnum>>G.arcnum;//输入总顶点数和总边数 cout<<"输入各点,构造表头结点表:"< for(int i=0;i { cin>>G.vertices[i].data;//输入顶点值 G.vertices[i].firstarc=NULL;//初始化表头结点的指针域为NULL } cout<<"输入各边,构造邻接表:"< for(int k=0;k { cin>>v1>>v2;//输入一条边依附的两个顶点 i=LocateVex(G,v1); j=LocateVex(G,v2);//确定v1和v2在G中的位置,即顶点在G.vertices中的序号 p1=new ArcNode;//生成一个新的边结点*p1 p1->adjvex=j;//邻接点序号为j p1->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p1;//将新结点*p1插入顶点v1的边表头部 p2=new ArcNode;//生成另一个对称的新的边结点*p2 p2->adjvex=i;//邻接点序号为i p2->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=p2;//将新结点*p1插入顶点v1的边表头部 } return OK; } Status FirstAdjVex(ALGraphG,int v) { ArcNode* p; p=G.vertices[v].firstarc; if(p) { return p->adjvex; } else return ERROR; } Status NextAdjVex(ALGraphG,intv,int w) { ArcNode *p; p=G.vertices[v].firstarc;