图的广度遍历

来源:互联网 发布:淘宝联盟怎么自助推广 编辑:程序博客网 时间:2024/06/06 11:49

根据上一篇转载的文章写了写 出了很多问题;最主要的是队列问题, 队列的数据结构忘了。。

代码如下

#include <bits/stdc++.h>using namespace std;/***********    队列的定义    ********/typedef struct QNode{    int data;    struct QNode *next;}QNode;typedef struct Queue{    QNode *head, *tail;    int len;}Queue;/***********    队列的操作    ********/void InitQueue(Queue &Q){    Q.tail = Q.head = (QNode *)malloc(sizeof(QNode));    Q.tail->next = NULL;    Q.len = 0;}void EnQueue(Queue &Q, int e){    QNode *p = (QNode *)malloc(sizeof(QNode));//带有头结点    p->data = e;    Q.tail->next = p;    Q.tail = p;    Q.tail->next = NULL;    Q.len++;}void DeQueue(Queue &Q, int &e){    QNode *temp = Q.head->next;    e = temp->data;    Q.head->next = temp->next;    if(Q.tail == temp) Q.tail = Q.head;    Q.len--;    free(temp);}int visited[100];/***********    图的定义    ********/typedef struct ArcNode{    int adjvex;    // int weight;    struct ArcNode *next;}ArcNode;typedef struct VNode{     int data;     ArcNode *first;}VNode, AdjList[100];typedef struct{    AdjList vertices;//邻接表    int vexnum, arcnum;}ALGraph;/***********    图的操作    ********/void AddArcNode(ALGraph &G, int arc1, int arc2){    ArcNode *p, *q, *add;    add = (ArcNode *)malloc(sizeof(ArcNode));    add->adjvex = arc2;    add->next = NULL;    p =  q = G.vertices[arc1].first;    if(p == NULL)        G.vertices[arc1].first = add;    else    {        if(p->adjvex > add->adjvex)        {            add->next = p;            G.vertices[arc1].first = add;        }        else        {            while(p->adjvex < add->adjvex && p->next != NULL)            {             q = p;             p = p->next;            }            if(p->next == NULL)             {                 if(p->adjvex < add->adjvex)                    p->next = add;                 else                 {                     q->next = add;                     add->next = p;                 }             }            else                {                    add->next = p;                    q->next = add;                }        }    }}void CreatALGraph(ALGraph &AG){    printf("please input vexnum, arcnum\n");    scanf("%d %d", &AG.vexnum, &AG.arcnum);    for(int i = 0; i < AG.vexnum; ++i)    {        //scanf("%d", &AG.vertices[i].data);        AG.vertices[i].data = i;        AG.vertices[i].first = NULL;    }    for(int i = 0; i < AG.arcnum; ++i)    {      int a, b;      scanf("%d %d", &a, &b);      AddArcNode(AG, a, b);      AddArcNode(AG, b, a);//无向图    }}void Visit(int e){    printf(" %d", e);}int FirstAdjVex(ALGraph AG, int v){    if(AG.vertices[v].first == NULL)        return -1;    else    {        return AG.vertices[v].first->adjvex;    }}int NextAdjVex(ALGraph AG, int v, int w){    if(AG.vertices[v].first == NULL)        return -1;    else    {        ArcNode *p = AG.vertices[v].first;        while(p->adjvex != w)        {            p = p->next;        }        if(p->next == NULL)            return -1;        else            return p->next->adjvex;    }}void BFS(ALGraph AG, int v, void (*Visit)(int)){    Visit(v);    visited[v] = 1;    Queue q;    InitQueue(q);    EnQueue(q, v);    while(q.len >= 1)    {        DeQueue(q, v);        for(int w = FirstAdjVex(AG, v); w >= 0; w = NextAdjVex(AG, v, w))          if(!visited[w])            {                Visit(w);                visited[w] = 1;                EnQueue(q, w);            }    }}void BFSTraverse(ALGraph AG, int v, void (*Visit)(int)){    for(int i = 0; i < AG.vexnum; ++i)        visited[i] = 0;    BFS(AG, v, Visit);    for(int i = 0; i < AG.vexnum; ++i)     if(!visited[i])      BFS(AG, i, Visit);}void PrintfGraph(ALGraph AG){    for(int i = 0; i < AG.vexnum; ++i)    {        printf("%d 的临界点为 ", i);        if(AG.vertices[i].first != NULL)        {            ArcNode *temp = AG.vertices[i].first;            while(temp != NULL)            {                printf(" %d", temp->adjvex);                temp = temp->next;            }        }        else            printf("NO");        printf("\n");    }}int main(){   ALGraph G;   int V;   CreatALGraph(G);   PrintfGraph(G);   scanf("%d", &V);   BFSTraverse(G, V, Visit);}