先访问某一结点的所有邻接点,再依次访问邻接点的邻接点
#include<iostream>
#define MVNum 100
using namespace std;
typedef char VerTexType;
typedef struct ArcNode{ //边结点
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{ //头结点
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct{ //图结构
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,VerTexType u){ //找结点u在顶点表中的序号
int i;
for(i=0;i<G.vexnum;i++)
if(u==G.vertices[i].data) return i;
return -1;
}
int CreateUDG(ALGraph &G){
int i,j,k;
cout<<"请输入总顶点数和总边数:";
cin>>G.vexnum>>G.arcnum;
cout<<"请输入各顶点:";
for(i=0;i<G.vexnum;i++){ //初始化顶点表
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
for(k=0;k<G.arcnum;k++){
VerTexType v1,v2;
ArcNode *p1,*p2;
cout<<"请输入边依附的两个顶点:";
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p1=new ArcNode; //新建边结点p1,头插法插入到第i个顶点后
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p1;
p2=new ArcNode; //新建边结点p2,头插法插入到第j个顶点后
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
}
return 1;
}
void Show(ALGraph G){
int i;
for(i=0;i<G.vexnum;i++){
cout<<G.vertices[i].data<<' ';
if(G.vertices[i].firstarc){
ArcNode *p=G.vertices[i].firstarc;
while(p){
cout<<p->adjvex<<" ";
p=p->nextarc;
}
}
cout<<endl;
}
}
#define MAXQSIZE 100
typedef struct{
int *base;
int front,rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue &Q){
Q.base=new int[MAXQSIZE];
Q.front=Q.rear=0;
}
//判断队空
int EmptyQueue(SqQueue Q){
if(Q.front==Q.rear) return 1;
else return 0;
}
//入队
void EnQueue(SqQueue &Q,int e){
if((Q.rear+1)%MAXQSIZE==Q.rear) exit(0); //队满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
}
//出队
void DeQueue(SqQueue &Q,int &e){
if(EmptyQueue(Q)) exit(0); //队空
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
}
//广度优先搜索BFS
bool visited[MVNum];
void BFS(ALGraph G,int v){
cout<<G.vertices[v].data; visited[v]=true; //访问v结点
SqQueue Q;
InitQueue(Q);
EnQueue(Q,v); //将v结点入队
while(!EmptyQueue(Q)){ //如果队不为空
int u;
DeQueue(Q,u); //出队顶点u
ArcNode *p=G.vertices[u].firstarc; //p指向u结点的第一个边结点
while(p!=NULL){ //如果p所指边结点不为空
int w=p->adjvex; //w为邻接点
if(!visited[w]){ //且w未被访问过
cout<<G.vertices[w].data; visited[w]=true; EnQueue(Q,w); //访问w结点
}
p=p->nextarc; //p指向下一个边结点
}
}
}
int main(){
ALGraph G;
CreateUDG(G);
cout<<"采用邻接表构造的无向图为:"<<endl;
Show(G);
cout<<"输入起点:";
int v;
cin>>v;
cout<<"邻接表的BFS为:";
BFS(G,v);
return 1;
}
运行结果