图的广度遍历

#include<stdio.h> #define MaxVertexNum 100 typedef int VertexType; typedef enum{FALSE,TRUE}Boolean;//FALSE为0, TRUE为1 Boolean visited[MaxVertexNum];//访问标志向量是全局量 typedef int datatype; typedef struct qnode{  datatype data;  struct qnode *next; }position; typedef struct queue{ position *front; position *rear; }queuetype; typedef struct node{//边表结点  int adjvex;//邻接点域  struct node *next;//链域,若要表示一个边上的权,则应增加一个数据域 }EdgeNode; typedef struct vnode{//顶点表结点  VertexType vertex;//顶点域  EdgeNode *firstedge;//边表头指针 }VertexNode; typedef VertexNode AdjList[MaxVertexNum];//AdjList是邻接表类型 typedef struct ALGraph{  AdjList adjlist;//邻接表  int n,e;//图中当前顶点数和边数 }Graphic;//对于简单的应用,无须定义此类型,可直接使用AdjList类型 int Dequeue(queuetype *q) {  position *p;  int data;  p=q->front;  q->front=q->front->next;  data=p->data;  free(p);  return data; } //在队列中加入新元素 void Enqueue(queuetype *q,datatype x) {  position *p;  p=(position *)malloc(sizeof(position *));  p->data=x;  p->next=NULL;  q->rear->next=p;  q->rear=p; }

int Empty(queuetype *q) {  return(q->front==q->rear); } void InitQueue(queuetype *Q) {  Q=NULL;  ///初始化 } void BFS(Graphic *G,int k) {//以vk为源点对用邻接表表示的图G进行广度优先搜索  int i;  queuetype Q;//须将队列定义中DataType改为 int  EdgeNode *p;  InitQueue(&Q);  //访问原点vk  printf("visit vertex:%c",G->adjlist[k].vertex);  visited[k]=TRUE;  Enqueue(&Q,k);//vk原点已访问,将其入队,及其序号入队  while(!Empty(&Q))  {   //队列非空时执行   i=Dequeue(&Q);//相当于vi出队   p=G->adjlist[i].firstedge;//取vi的边表头指针   while(p){//依次搜索vi的邻接点vj (令p->adjvex=j)    if(!visited[p->adjvex])    {     //如果未访问过     printf("visitvertex:%c",G->adjlist[p->adjvex].vertex);     //访问vj     visited[p->adjvex]=TRUE;     Enqueue(&Q,p->adjvex );//访问过的vj入队    }    p=p->next;//找vi下一个结点   }  } } void CreateGraphic(Graphic *G) {//建立无向图的邻接表表示

 int i,j,k;  EdgeNode *s;  printf("please input 顶点数和边数:/n");   scanf("%d%d",&G->n,&G->e);//读入顶点数和边数  for(i=0;i<G->n;i++){//建立顶点表   G->adjlist[i].vertex=getchar();//读入顶点信息   G->adjlist[i].firstedge=NULL;//边表置为为空表  }  for(k=0;k<G->e;k++){//建立边表   printf("please  input(vi,vj)的顶点对序号:/n");   scanf("%d%d",&i,&j);//读入边(vi,vj)的顶点对序号   s=(EdgeNode *)malloc(sizeof(EdgeNode));//生成边表结点   s->adjvex=j;//邻接点序号为j   s->next=G->adjlist[i].firstedge;   G->adjlist[i].firstedge=s;//将新结点插入顶点的边表头部   s=(EdgeNode *)malloc(sizeof(EdgeNode));   s->adjvex=i;//邻接点序号为   s->next=G->adjlist[j].firstedge;   G->adjlist[j].firstedge=s;//将新结点*s插入vi顶点的边表头部  } } void BFSTraverse(Graphic *G) {  int i;  for(i=0;i<G->n;i++)        visited[i]=FALSE;//标志向量初始化  for(i=0;i<G->n;i++)   if(!visited[i])//vi未访问过    BFS(G,i);//以vi原点开始搜索 } void main(void) {  Graphic Create;  CreateGraphic(&Create);  BFSTraverse(&Create); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值