本实验实现邻接表表示下无向图的广度优先遍历。
程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志)。程序的输出为图的邻接表和广度优先遍历序列。例如:
程序输入为:
a
b
c
d
e
f
*
0,1
0,4
1,4
1,5
2,3
2,5
3,5
-1,-1
程序的输出为:
the ALGraph is
a 4 1
b 5 4 0
c 5 3
d 5 2
e 1 0
f 3 2 1
the Breadth-First-Seacrh list:aebfdc
下面展示一些 测试样例
。
测试输入
测试输入
a
b
c
d
e
f
*
0,1
0,4
1,4
1,5
2,3
2,5
3,5
-1,-1
测试输出
the ALGraph is
a 4 1
b 5 4 0
c 5 3
d 5 2
e 1 0
f 3 2 1
the Breadth-First-Seacrh list:aebfdc
代码如下
#include<stdio.h>
#include<stdlib.h>
struct node{
char data;
int num;
int visit;
int chain[50];
}list[50];
void bfs(int n)
{
int queue[50];
int qnum=0;
if(list[n].visit==0)
{
printf("%c",list[n].data);
list[n].visit=1;
}
for(int i=list[n].num-1;i>=0;i--)
{
if(list[list[n].chain[i]].visit==0)
{
queue[qnum++]=list[n].chain[i];
printf("%c",list[list[n].chain[i]].data);
list[list[n].chain[i]].visit=1;
}
}
for(int i=0;i<qnum;i++)
bfs(queue[i]);
}
int main()
{
int n=0,a,b;
char c;
while(1)
{
c=getchar();
if(c=='*')
break;
else
{
list[n].num=0;
list[n].visit=0;
list[n++].data=c;
}
getchar();
}
while(1)
{
scanf("%d,%d",&a,&b);
if(a==-1&&b==-1)
break;
else
{
list[a].chain[list[a].num]=b;
list[a].num++;
list[b].chain[list[b].num]=a;
list[b].num++;
}
}
printf("the ALGraph is\n");
for(int i=0;i<n;i++)
{
printf("%c",list[i].data);
for(int j=list[i].num-1;j>=0;j--)
printf(" %d",list[i].chain[j]);
printf("\n");
}
printf("the Breadth-First-Seacrh list:");
for(int i=0;i<n;i++)
if(list[i].visit==0)
bfs(i);
printf("\n");
return 0;
}