当前位置: 首页 > news >正文

图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版)
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define MAXQSIZE 100
#define OK 1
typedef char VertexType;
typedef int QElemType;
 
typedef struct ArcNode//边结点
{
    int adjvex;
    struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode//定义头数组
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct ALGraph//定义图
{
    AdjList vertices;
    int vernum,arcnum;
}ALGraph;

typedef struct SqQueue
{
    QElemType *base;
    int front;
    int rear;
}SqQueue;

int CreateDG(ALGraph &G)
{
    int i,j,k,v1,v2;
    ArcNode *p;
    printf("请输入图的节点数:");
    scanf("%d",&G.vernum );
    printf("请输入图的边的个数:");
    scanf("%d",&G.arcnum);
    for(i=0;i<G.vernum;i++)
    {
        printf("请输入第%d个顶点数据:",i+1);
        getchar();
        scanf("%c",&G.vertices[i].data);
        //G.vertices[i].data=i;
        G.vertices[i].firstarc=NULL;
    }
    printf("请输入节点的边关系,如:结点1和结点2有边就输入1和2(每条边就输入一次):\n");
    for(k=0;k<G.arcnum;k++)
    {
        printf("请输入第%d条边的一个结点:",k+1);
        scanf("%d",&v1);
        printf("请输入第%d条边的另一个结点:",k+1);
        scanf("%d",&v2);
        printf("\n");
        i=v1;
        j=v2;
        while(i<1||i>G.vernum||j<1||j>G.vernum)
        {
            printf("请输入第%d条边的一个结点:",k+1);
            scanf("%d",&v1);
            printf("请输入第%d条边的一个结点:",k+1);
            scanf("%d",&v2);
            printf("\n");
            i=v1;
            j=v2;
        }
        p=(ArcNode *)malloc(sizeof(ArcNode));
        if(!p)
        {
            printf("分配内存失败!\n");
            return 0;
        }
        p->adjvex=j-1;
        p->nextarc=G.vertices[i-1].firstarc;
        G.vertices[i-1].firstarc=p;
    }
    return OK;
}
int InitQueue(SqQueue &Q)
{
    Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
    if(!Q.base)
    {
        printf("队列内存失败!\n");
        return 0;
    }
    Q.front=Q.rear=0;
    return (OK);
}

int EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+1)%MAXQSIZE==Q.front)
    {
        printf("队列已满!\n");
        return 0;
    }
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXQSIZE;
    return (OK);
}
int QueueEmpty(SqQueue Q)
{
    if(Q.front==Q.rear)
        return (OK);
    else 
        return 0;
}

int DeQueue(SqQueue &Q,QElemType &e)
{
    if(Q.front==Q.rear)
    {
        printf("队列为空!无法删除!\n");
        return 0;
    }
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%MAXQSIZE;
    return (e);
}
void BFSTraverse(ALGraph G)
{
    int i,j,k;
    int visited[MAX_VERTEX_NUM];
    ArcNode *p;
    SqQueue Q;
    for(i=0;i<G.vernum;i++)
        visited[i]=0;
    InitQueue(Q);
    for(i=0;i<G.vernum;i++)
    {
        if(visited[i]==0)
        {
            visited[i]=1;
            printf("%c-->",G.vertices[i].data);
            EnQueue(Q,i);
            while(!QueueEmpty(Q))
            {
                DeQueue(Q,j);
                for(k=j,p=G.vertices[j].firstarc;p!=NULL;k=p->adjvex,p=p->nextarc)
                {
                    if(visited[k]==0)
                    {
                        visited[k]=1;
                        printf("%c-->",G.vertices[k].data);
                        EnQueue(Q,k);
                    }
                }
            }
        }
    }
}
int main()
{
    ALGraph G;
    CreateDG(G);
    
    printf("广度优先搜索结果为\n开始-->");
    BFSTraverse(G);
    printf("结束!\n");
    return 0;
}

运行结果截图:

相关文章:

  • Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引
  • svn服务器的搭建
  • Atitit.获取某个服务 网络邻居列表 解决方案
  • 通过Android源代码分析startActivity()过程(下)
  • 转:MyBatis学习总结(Mybatis总结精华文章)
  • 【LINUX 学习】使用find和xargs[转摘自《shell编程和unix命令》]
  • 关于PowerBuilder 9.0中如何修改项目工程名字
  • MapReduce实现TopK
  • toolBar和toolBarItem的定制
  • WebService学习总结(2)——WebService是什么?
  • centos7 下的 KVM
  • subline的node.js安装和快捷键
  • 新建文件夹及其他
  • 简单实现图片验证码
  • 进度条工具类
  • python3.6+scrapy+mysql 爬虫实战
  • 分享的文章《人生如棋》
  • 时间复杂度分析经典问题——最大子序列和
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【css3】浏览器内核及其兼容性
  • EOS是什么
  • es的写入过程
  • IDEA 插件开发入门教程
  • in typeof instanceof ===这些运算符有什么作用
  • JSONP原理
  • maven工程打包jar以及java jar命令的classpath使用
  • React的组件模式
  • redis学习笔记(三):列表、集合、有序集合
  • tensorflow学习笔记3——MNIST应用篇
  • Vue组件定义
  • 阿里云购买磁盘后挂载
  • 多线程 start 和 run 方法到底有什么区别?
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 什么是Javascript函数节流?
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序:实现悬浮返回和分享按钮
  • 再次简单明了总结flex布局,一看就懂...
  • 在electron中实现跨域请求,无需更改服务器端设置
  • mysql面试题分组并合并列
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 正则表达式-基础知识Review
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (十)c52学习之旅-定时器实验
  • (四)库存超卖案例实战——优化redis分布式锁
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***测试-HTTP方法
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'