邻接表的广度优先搜索——数据结构

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode
{
    char data[10];
    ArcNode * firstarc;
}VNode,Adjlist[100];
typedef struct
{
    Adjlist vertices;
    int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,char v[10])
{
    for(int i=0;i<G.vexnum;i++)
    if(strcmp(v,G.vertices[i].data)==0)
    return i;
    return -1;
}
void creat(ALGraph &G)
{
    cin>>G.vexnum>>G.arcnum;
    int i,k,j;
    char v1[10],v2[10];
    ArcNode * p1,*p2;
    for(i=0;i<G.vexnum;i++)
    {
        cin>>G.vertices[i].data;
        G.vertices[i].firstarc=NULL;
    }
    for(k=0;k<G.arcnum;k++)
    {
         cin>>v1>>v2;
         i=LocateVex(G,v1);
         j=LocateVex(G,v2);
         p1=new ArcNode;
         p1->adjvex=j;
         p1->nextarc=G.vertices[i].firstarc;
         G.vertices[i].firstarc=p1;
         p2=new ArcNode;
         p2->adjvex=i;
         p2->nextarc=G.vertices[j].firstarc;
         G.vertices[j].firstarc=p2;
    }
}
typedef struct
{
    char k[100];
    int front;
    int rear;
}SqQueue;

void InItQueue(SqQueue &q)
{
    q.front=q.rear=0;
}
void EnQueue(SqQueue &q,int e)
{
    q.rear=(q.rear+1)%100;
    q.k[q.rear]=e;
}
void DeQueue(SqQueue &q,int &e)
{
   q.front=(q.front+1)%100;
   e=q.k[q.front];
}
int QueueEmpty(SqQueue q)
{
    if(q.front==q.rear)
        return 1;
    else
        return 0;
}
int visited[100];
void bfs(ALGraph G,int n)
{
    SqQueue q;
    int u;
    printf("v");
    printf("%s ",G.vertices[n].data);
    visited[n]=1;
    InItQueue(q);
    EnQueue(q,LocateVex(G,G.vertices[n].data));
    ArcNode*p;
    while(!QueueEmpty(q))
    {
        DeQueue(q,u);
        p=G.vertices[u].firstarc;
        while(p!=NULL)
        {
            if(!visited[p->adjvex])
            {
                visited[p->adjvex]=1;
                EnQueue(q,p->adjvex);
                printf("v");
                printf("%s ",G.vertices[p->adjvex].data);
            }
            p=p->nextarc;
        }

    }
}
int main()
{
    ALGraph G;
    creat(G);
    int k;
    for(k=0;k<100;k++)
        visited[k]=0;
    bfs(G,0);
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值