BFS(广度优先搜索)遍历

/* BFS: 广度优先,结合队列实现遍历方式 1.选对一个入口 2.访问所有的当前顶点的所有邻接顶点 3.出队,找当前顶点邻接顶点 4.标记已经遍历节点 5.队列为NULL,所有顶点都被访问*/#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>typedef char Vertex
摘要由CSDN通过智能技术生成
/*
     BFS: 广度优先,结合队列实现遍历方式
     1.选对一个入口
     2.访问所有的当前顶点的所有邻接顶点
     3.出队,找当前顶点邻接顶点
     4.标记已经遍历节点
     5.队列为NULL,所有顶点都被访问
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char VertexType[4];
#define MAX 10

typedef   struct   ArcNode
{
     int   vexIndex;     //顶点在顶点数组中的序号
     struct   ArcNode* next;    
}Node,*LPNODE;

//链表操作
LPNODE   createNode(int    vexIndex)
{
     LPNODE  newNode = (LPNODE)malloc(sizeof(NODE));
     newNode->vexIndex = vexIndex;
     newNode->next = NULL;
     return    newNode;
}

//无表头链表的表头法插入
//LPNODE *headNode这里用的是二级指针,因为无表头的插入会修改表头的指向
void   insertNodeByHead(LPNODE *headNode,int  vexIndex)
{
       LPNODE  newNode = createNode(vexIndex);
       newNode->next = *headNode;
       *headNode = newNode;
}

//图结构:数组,链表
//顶点信息描述出来
typedef  struct   VNode
{
      VertexType   data;       //数据
      LPNODE  firstNode;    //每个数据都带有一个指针
}VNODE,ARRAY[MAX],*LPVNODE;

//图
typedef  struct   GRAPH
{
     int   arcNum;          //边数
     int   vexnum;          //顶点数
     ARRAY   vextex;    //结构体数组
}GRAPH,*LPGRAPH;

//创建图
int  searchPos(LPGRAPH  G,VertexType   X)
{
     for(int  i=0;i<G->vexnum;i++)
     {
             if(strcmp(G->vextex[i].data,x)==0)
             {
                    return  i;
             }
     }
     return  -1;
}

//创建图
LPGRAPH   createGraph()
{
     LPGRAPH    G = (LPGRAPH)malloc(sizeof(GRAPH));
     printf("输入边数和顶点数:",&G->arcnum,&G->vexnum);
     printf("请输入 %d 个顶点:\n"G->vexnum);
     for(int i=0;i < G->vexnum; i++)
     {
            scanf("%s",G->vextex[i].data);
            G->vextex[i].firstNode = NULL;    //指针需要初始化         
     }
     VertexType   v1,v2;
     int   posV1;
     int   posV2;
     printf("请输入边的信息:\n");
     for(int  i=0;i<G->arcnum;i++)
     {
           scanf("%s%s",v1,v2);
           posV1 = searchPos(G,v1);
           posV2 = searchPos(G,v2);
           //把v2插到以v1为顶点的链表中去
           insertNodeByHead(&G->vextex[posV1].firstNode,posV2);
           //把v1插到以v2为顶点的链表中去
           insertNodeByHead(&G->vextex[posV2].firstNode,posV1);
     }
     return  G;
}

//访问
void    visitVextex(VertexType   x)
{
      printf("%s-->",x);
]

void   BFSTravers(LGPRAPH   G, int   inPos)
{
       int   visited[MAX] = {0};   //访问标记
       //对列三要素
       int  queue[MAX];     //顶点的序号
       int  front; = -1;         //队头的元素
       int  rear = -1;           //队尾的元素
       //1.选定入口
       visitVextex(G->vextex[inPos].data);
       viseted[inPos] = 1;         //把访问标记置为 1 
        
       queue[++rear] = inPos;   //把走过的元素入队
       LPNODE  pMove = NULL;
       while(front < rear)
       {
                //出队
                inPos = queue[++front];
                pMove = G->vextex[inPos].firstNode;
                while(pMove)
                {
                        //没有被访问,就访问一次
                        if(visited[pMove->vexIndex] == 0)
                        {
                               vistVextex(G->vextex[pMove->vexIndex].data);
                               visited[pMove->vexIndex] = 1;
                               //把访问的元素入队
                               queue[++rear] = pMove->vexIndex;
                        }
                        pMove = pMove->next;   //被打印就不再做打印处理
                ]
       }
}

int main()
{
		LPGAPH G = createGraph();
		BFSTravers(G,0);
		printf("\n");

	    system("pause");
	    return  0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值