BFS的一种序列为:Z W B H X D F L Y C
# include<stdio.h>
# include <stdlib.h>
# define Max 100
//链表结点的结构定义
struct ListNode{//存放的是链表的节点
int index;// 所连接定点的下标
struct ListNode *next;
};
//顶点的结构定义
struct VNode{
char str;//存放的是顶点字符
ListNode *firstarc;//邻接表顶点指针域
};
//图结构定义
struct ALGraph{
VNode vertex[Max];
int vexnum;//存放的是定点的个数
int arcnum;//存放的是边的个数
};
//数组,记录顶点的两种状态:0表示未访问该顶点,1表示已经访问过该顶点
int visited[Max];
//已知字符u,找到该顶点对应的下标并返回
int LocateVex(ALGraph G,char u)
{
int i;
for (i=0;i<G.vexnum;i++)
{
if(u==G.vertex[i].str) return i;//在存放顶点信息的数组中找出该顶点的下标
}
if (i==G.vexnum)
{
printf("Error u!\n");exit(1);
}
return 0;
}
//创建并初始化图
void Create(ALGraph &G)
{
int i, j, k, w;
char v1,v2,enter;
ListNode *p;//创建一个顶点
printf("请输入顶点数和边数:\n");
scanf("%d",&G.vexnum);
scanf("%d",&G.arcnum);
printf("请输入顶点:\n");
for (i=0;i<G.vexnum;i++)
{ scanf("%c%c",&enter,&G.vertex[i].str);
G.vertex[i].firstarc=NULL;
}
printf("请输入边的2个顶点:\n");
for (k=0;k<G.arcnum;k++)
{
scanf("%c%c",&enter,&v1); //输入数后按下回车,enter会读取回车并丢弃掉
scanf("%c%c",&enter,&v2);
i=LocateVex(G,v1);//存放在该单链表的第几个顶点
j=LocateVex(G,v2);//找到要存放顶点的下标
p=(ListNode*)malloc(sizeof(ListNode));
p->index=j;// 要链接顶点的下标
p->next=G.vertex[i].firstarc;
G.vertex[i].firstarc=p;
p=(ListNode*)malloc(sizeof(ListNode));
p->index=i;// 要链接顶点的下标
p->next=G.vertex[j].firstarc;
G.vertex[j].firstarc=p;
}
printf("\nBFS其中的一种序列为:");
}
//用数组模拟一个队列
void BFS(ALGraph &G)
{
int i, temp, front=-1, rear=-1; //front指向队头的前一个元素,rear指向队尾
ListNode *p;
int a[G.vexnum];
a[++rear]=0;
visited[0]=1;
printf("%c", G.vertex[0].str);
for(i=0;i<G.vexnum;i++){
temp=a[++front]; //出队
p=G.vertex[temp].firstarc;
if(visited[temp]!=1) {visited[temp]=1; a[++rear]=temp; printf("%c", G.vertex[temp].str);}
while(p){
if(visited[p->index]!=1) {visited[p->index]=1; a[++rear]=p->index; printf("%c", G.vertex[p->index].str);p=p->next;}//入队
else p=p->next;
}
}
}
int main(void)
{
ALGraph G;
Create(G);//用邻接表创建一个图
BFS(G); //用数组模拟一个队列
return 0;
}