数据结构——BFS邻接表遍历

来源:互联网 发布:保险行业收入 知乎 编辑:程序博客网 时间:2024/05/16 16:14
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;}


运行结果:



阅读全文
0 0