0
点赞
收藏
分享

微信扫一扫

图的广度遍历


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

代码如下

#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);
}




举报

相关推荐

0 条评论