本实验实现邻接表表示下无向图的广度优先遍历。
程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-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<string.h>
#include<stdlib.h>
#define vexnum 500
typedef struct node{
char data;
int link;
int flag;
int g[vexnum];
struct node *next;
}node;
typedef struct node1{
int jiedian;
struct node1 *link1;
struct node1 *link2;
}node1;
int i,j,y,z;
int count=0;
char x;
int visited[vexnum];
node *a[vexnum],*b[vexnum];
node *p,*p1;
node1 *q,*q1;
node1 *head,*head1,*end;
void condition1(){
while(scanf("%c\n",&x),x!='*'){
a[count]=(node*)malloc(sizeof(node));
a[count]->data=x;
a[count]->flag=0;
a[count]->next=NULL;
b[count]=a[count];
count++;
}
}
void condition2(){
while(scanf("%d,%d",&y,&z),y!=-1&&z!=-1){
p=(node*)malloc(sizeof(node));
p->link=z;
p->next=a[y]->next;
a[y]->next=p;
a[y]->g[a[y]->flag]=p->link;
a[y]->flag++;
p=(node*)malloc(sizeof(node));
p->link=y;
p->next=a[z]->next;
a[z]->next=p;
a[z]->g[a[z]->flag]=p->link;
a[z]->flag++;
}
}
void printf(){
printf("the ALGraph is\n");
for(i=0;i<count;i++){
p=a[i]->next;
printf("%c",a[i]->data);
while(p!=NULL){
printf(" %d",p->link);
p=p->next;
}
printf("\n");
}
q=(node1*)malloc(sizeof(node1));
q->link1=NULL;
q1=(node1*)malloc(sizeof(node1));
q1->link2=NULL;
end=q;
head=q1;
end->link2=head;
head->link1=end;
head1=head;
printf("the Breadth-First-Seacrh list:");
for(i=0;i<count;i++){
if(visited[i]!=1){
visited[i]=1;
printf("%c",a[i]->data);
q=(node1 *)malloc(sizeof(node1));
q->jiedian=i;
end->link2=q;
q->link1=end;
q->link2=head1;
head1->link1=q;
head1=end->link2;
q1=head->link1;
while(q1!=end){
p1=a[q1->jiedian]->next;
while(p1!=NULL){
if(visited[p1->link]!=1){
printf("%c",a[p1->link]->data);
visited[p1->link]=1;
q=(node1*)malloc(sizeof(node1));
q->jiedian=p1->link;
end->link2=q;
q->link1=end;
q->link2=head1;
head1->link1=q;
head1=end->link2;
}
p1=p1->next;
}
q1=q1->link1;
}
}
}
}
int main(){
memset(visited,0,sizeof(visited));
condition1();
condition2();
printf();
printf("\n");
}