队列是利用链表节点实现的:
#include<stdio.h>
#include<stdlib.h>
#define M 8
#define List_INIT_SIZE 100
#define List_INC 10
int ever[M];
typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QNodeptr;
typedef struct{
QNodeptr front;
QNodeptr rear;
int ListSize;
}List;
void InitList(List &L){
L.front=L.rear=(QNodeptr)malloc(sizeof(QNode));
if(!L.front ){
exit(0);
}else{
L.front->next=NULL;
printf("队列初始化成功\n");
}
}
void pop(List &L,int &e){
if(L.front==L.rear){
exit(0);
}
QNodeptr p=L.front->next;
e=L.front->next->data;
L.front->next=L.front->next->next;
if(p==L.rear){
L.rear=L.front;
}
free(p);
}
void push(List &L,int i){
QNodeptr p=(QNodeptr)malloc(sizeof(QNode));
if(!p){
exit(0);
}
p->data=i;
p->next=NULL;
L.rear->next=p;
L.rear=p;
printf("%d进队列\n",i);
}
int Empty(List L){
if(L.front==L.rear){
return 1;
}return 0;
}
void init(int map[][M]){
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
scanf("%d",&map[i][j]);
}
}
}
void show(int map[][M]){
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
printf("%d",map[i][j]);
}
}
}
void bfs(List &L,int map[][M],int i){
char ph=i+65;
printf("%c已经被访问过了\n",ph);
ever[i]=1;
push(L,i);
while(!Empty(L)){
int e=0;
pop(L,e);
printf("%d出队列\n",e);
for(int j=0;j<M;j++){
if(map[e][j]==1&&ever[j]==0){
ph=j+65;
printf("%c已经被访问过了\n",ph);
push(L,j);
ever[j]=1;
}
}
printf("退出一次\n");
}
}
void BFS(List &L,int map[][M]){
for(int i=0;i<M;i++){
ever[i]=0;
}
for(int i=0;i<M;i++){
if(ever[i]==0){
printf("判断%d\n",i);
bfs(L,map,i);
}
}
}
void main(){
int map[M][M];
init(map);
List L;
InitList(L);
//show(map);
BFS(L,map);
}