include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct node{ //定义结点结构 由数据域vertex和指针域next组成
int vertex;
struct node *next;
}NODE;
typedef struct hnode{ //定义头结点结构 由数据域head和 指针域first组成 !!!注意 !!! 指针域类型是node 而不是hnode!!!
int head;
struct node *first;
}HNODE;
typedef struct{ //定义邻接表的结构 由头结点数组 和头结点数n边数e组成 !!!注意 !!!头结点数组存放的是头结点 而不是头结点指针!!
HNODE list[10];
int n,e;
}GRAPH;
typedef struct Queue{ //队列的结构 由头指针pBase(就像是个数组名,代表着数组的首地址)和front rear组成。
int *pBase;
int front;
int rear;
}QUEUE ;
void init(QUEUE *pQ);
void add(QUEUE *pQ,int val);
void list(QUEUE *pQ);
bool fullQueue(QUEUE *pQ);
bool empty(QUEUE *pQ);
void out(QUEUE *pQ,int *var);
void create(GRAPH *G);
void bfsl(QUEUE Q,GRAPH *G,int var);
int b[50]={0};
int var;
int main(){
GRAPH *G=(GRAPH *)malloc(sizeof(GRAPH));
create(G);
QUEUE Q;
init(&Q);
printf("请输入开始结点:\n");
scanf("%d",&var);
add(&Q,var);
b[var]=1;
bfsl(Q,G,var);
}
void bfsl(QUEUE Q,GRAPH *G,int var)
{
while(!empty(&Q))
{
out(&Q,&var);
while(G->list[var].first!=NULL)
{
if(b[G->list[var].first->vertex]!=1)
{
printf("访问结点:%d\n",G->list[var].first->vertex);
b[G->list[var].first->vertex]=1; //已被访问过的需要被标记
add(&Q,G->list[var].first->vertex);//并将该结点入队 ,每个节点只能入队一次
}
G->list[var].first=G->list[var].first->next;
}
}
}
void create(GRAPH *G){
int p,q,i,j,m;
NODE *s;
printf("请输入定点数n和边数e:");
scanf("%d %d",&G->n,&G->e);
for(p=0;p<G->n;p++)
{
printf("请输入头节点:"); //初始化头结点
scanf("%d",&m);
G->list[m].head=m;
G->list[m].first=NULL;
}
for(q=0;q<G->e;q++)
{
printf("请输入边Vi Vj:");
scanf("%d %d",&i,&j);
s=(NODE *)malloc(sizeof(NODE));
s->vertex=j;
s->next=G->list[i].first;
G->list[i].first=s;
s=(NODE *)malloc(sizeof(NODE));
s->vertex=i;
s->next=G->list[j].first;
G->list[j].first=s;
}
}
void init(QUEUE *pQ){
pQ->pBase=(int *)malloc(sizeof(QUEUE)*6);//分配6个单元的数组空间给pBase, pBase即数组名 也是数组的首地址。
pQ->front=0;//空队列的front和rear都为0
pQ->rear=0;
}
void add(QUEUE *pQ,int val){
if(fullQueue(pQ)){
printf("队列已满,入队失败!\n");
}
else {
pQ->pBase[pQ->rear] =val;
pQ->rear=(pQ->rear+1)%6; //入队rear+1取余 front不变
}
}
void out(QUEUE *pQ,int *var){
if(empty(pQ)){
printf("空队列,出队失败!\n");
}
else{
*var=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%6; //出队 front+1取余 rear不变
}
}
bool fullQueue(QUEUE *pQ){ //判断队列是否已满 采用分配6个单元 只能放5个数据的方法,当front和rear相邻时 判断 队列已满。
if((pQ->rear+1)%6==(pQ->front))
return true;
else return false;
}
void list(QUEUE *pQ){
int i=pQ->front;
while(i<pQ->rear){
printf("%d",pQ->pBase[i]);
i=(i+1)%6;
}
printf("\n");
}
bool empty(QUEUE *pQ){
if(pQ->front==pQ->rear)//front=rear 即为空队列
return true;
else return false;
}
运行结果: