广度优先搜索遍历连通图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档