#include<iostream.h>
const intn=8; //表示图中的最大顶点数
const inte=15; //图中的最大边数
typedefint elemtype;
boolvisited[n+1]; //标志数组用于记载某个顶点是否被访问过
classlink //定义链表类型
{
public:
elemtype data;
link *next;
};
classGRAPH //定义邻接表的表头类型
{
public:
linka[n+1];
voidcreatlink() //建立图的邻接表
{
inti,j,k;
link *s;
for(i=1;i<=n;i++) //建立邻接表的表头类型
{
a[i].data=i;
a[i].next=NULL;
}
for(k=1;k<=e;k++)
{
cout<<“请输入一条边”;
cin>>i>>j; //输入一条边(i,j)
cout<<endl;
s=newlink; //申请一个动态存储单元
s->data=j;
s->next=a[i].next; //头插法建立链表
a[i].next=s; //头插法建立链表
s=newlink;
s->data=i;
s->next=a[j].next; //头插法建立链表
a[j].next=s; //头插法建立链表
}
}
voidbfs1(int i) //用邻接表从顶点i出发进行广度优先搜索遍历
{
intq[n+1]; //定义队列
int f,r;
link*p; //p为搜索指针
f=r=0;
cout<<a[i].data<<“”;
visited[i]=true;
r++;
q[r]=i; //进队
while(f<r)
{
f++;
i=q[f]; //出队
p=a[i].next;
while(p!=NULL)
{
if(!visited[p->data])
{
cout<<a[p->data].data<<“”;
visited[p->data]=true;
r++;
q[r]=p->data; //进队
}
p=p->next;
}
}
}
};
voidmain()
{
link *p;
int yn=1;
GRAPH G;
G.creatlink(); //建立邻接表
while(yn==1)
{
for(inti=1;i<=n;i++) //输出邻接表
{
p=G.a[i].next;
cout<<G.a[i].data<<“->”;
while(p->next!=NULL)
{
cout<<p->data<<“->”;
p=p->next;
}
cout<<p->data<<endl;
}
for(i=1;i<=n;i++)
visited[i]=false;
cout<<“请输入广度优先搜索开始访问的顶点”;
cin>>i;
cout<<endl;
cout<<“从”<<i<<“出发的广度优先搜索遍历序列为”<<endl;
G.bfs1(i);
cout<<endl;
cout<<“继续遍历吗(1/2)?”;
cin>>yn;
}
}