有向图的广度优先遍历

#include
#include
#include

typedef char VertexType[10];

//广度优先遍历
//先访问后入队
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0

#define MAX_VERTEX_NUM 31
typedef int Status;
typedef struct ArcNode//弧节点结构体
{
    int adjvex;
    int data;
    struct ArcNode * nextarc;
} ArcNode;
typedef struct VNode//顶点结构体
{
    VertexType data;
    ArcNode * firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct                         //创建图的结构体
{
    AdjList vertices;                   //顶点数组
    int vexnum, arcnum;           //顶点个数及弧的条数
} ALGraph;
typedef struct QNode//链队列
{
    int data;
    struct QNode *next;
} QNode,*QueuePtr;

typedef	struct
{
    QueuePtr front;	//对头指针
    QueuePtr rear;	//队尾指针
} LinkQueue;
Status InitQueue(LinkQueue &Q)
{
    //构造一个空队列Q
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if (!Q.front)
        exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
}
Status QueueEmpty(LinkQueue Q)
{
    //判断队列是否为空
    if (Q.front->next==NULL)
        return TRUE;
    return FALSE;
}
Status EnQueue(LinkQueue &Q, int e)
{
    //插入元素e为Q的新的队尾元素
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if (!p)
        return ERROR;
    p->next = NULL;
    p->data = e;
    Q.rear->next = p;
    Q.rear = p;
    return OK;
}
Status DeQueue(LinkQueue &Q, int &e)
{
    //若队列不空,则删除Q的队头元素,用e返回其值,并返回OK
    if (Q.front == Q.rear)
        return ERROR;
    QueuePtr p;
    p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if (Q.rear == p)
        Q.rear = Q.front;
    free(p);
    return OK;
}
int LocateVex(ALGraph G, VertexType v) //定位函数
{
    int i;
    for(i=0; i<G.vexnum; ++i)
        if(strcmp(v,G.vertices[i].data)==0)
            return i;
    return -1;
}
void CreateGraph(ALGraph &G)
{
    ArcNode *p;
    int i,j,k;
    VertexType v1,v2;
    //printf("分别输入顶点个数和边的数目:\n");
    scanf("%d%d",&G.vexnum,&G.arcnum);
    //printf("分别输入各个顶点值:\n");
    for(i=0; i<G.vexnum; i++)
    {
        scanf(" %s",G.vertices[i].data);
        G.vertices[i].firstarc=NULL;//初始化
    }
    //printf("分别输入各条弧的弧尾和弧头:\n");
    for(k=0; k<G.arcnum; k++)
    {
        scanf(" %s%s",v1,v2);
        i=LocateVex(G,v1);
        j=LocateVex(G,v2);//定位

        p=(ArcNode*)malloc(sizeof(ArcNode));//申请一个结点
        p->adjvex=j;
        p->nextarc=NULL;//赋值
        p->nextarc=G.vertices[i].firstarc;//连接结点
        G.vertices[i].firstarc=p;//连接结点
    }
}
int FirstAdjVex(ALGraph G,int v)
{
    ArcNode *p;
    p=G.vertices[v].firstarc;
    if(p)
    {
        return p->adjvex;
    }
    else
        return -1;


}
int NextAdjVex(ALGraph G,int v,int w)
{
    ArcNode *p;
    p=G.vertices[v].firstarc;
    while(p&&p->adjvex!=w)
    {
        p=p->nextarc;

    }
    if(!p||!p->nextarc)
    {
        return -1;
    }
    else
        return p->nextarc->adjvex;

}
void BFSTraverse(ALGraph G)
{
    LinkQueue Q;
    int u;
    int visited[30];

    int v,w;
    ArcNode *p;
    for(v=0; v<G.vexnum; v++)
    {
        visited[v]=FALSE;
    }
    InitQueue(Q);//置空的辅助队列Q
    for(v=0; v<G.vexnum; v++)
    {
        if(!visited[v])//v尚未访问
        {
            visited[v]=TRUE;
            printf("%s ",G.vertices[v].data);
            EnQueue(Q,v);//v入队列
            while(!QueueEmpty(Q))
            {

                DeQueue(Q,u);//队头元素出队并置为u
                p=G.vertices[u].firstarc;

                while(p)
                {
                    if(!visited[p->adjvex])
                    {
                        visited[p->adjvex]=TRUE;
                        printf("%s ",G.vertices[p->adjvex].data);
                        EnQueue(Q,p->adjvex);

                    }
                    p=p->nextarc;

                }
            }

        }

    }
}
int main()
{
    ALGraph G;
    CreateGraph(G);
    BFSTraverse(G);
    return 0;


}

你可能感兴趣的:(笔记,数据结构)