利用队列实现图的广度优先遍历

队列是利用链表节点实现的:

#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);
	
} 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/amanicspater/article/details/50008729
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞