图的广度优先搜索(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;
}

运行结果截图:

相关文章
|
存储 分布式计算 关系型数据库
从零到一建设数据中台 - 功能组织与实现技术
从零到一建设数据中台 - 功能组织与实现技术
857 0
|
网络协议 Linux C++
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
1056 0
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
2天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
346 91
|
10天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
830 156
|
3天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
250 156
|
3天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~