• 用邻接表实现DFS和BFS


    #include <stdio.h>
    #include <stdlib.h>
    #define MAXVERTEX 10
    typedef char VertexType;                //顶点类型
    typedef int EdgeType;                   //边的类型
    typedef int ElemType;                   //队列中元素类型
    typedef struct EdgeNode
    {
        int adjvex;
        EdgeType weight;
        struct EdgeNode *next;
    }EdgeNode;                              //在邻接表中存放邻接顶点下标值的结点
    typedef struct VertexNode
    {
        int Flag;
        int vertex;
        VertexType data;
        EdgeNode *firstedge;
    }VertexNode,AdjList[MAXVERTEX];         //定义一个MAXVERTEX个顶点的邻接表
    typedef struct GraphAdjList
    {
        AdjList adjList;
        int numVertex;
        int numEdge;
    }GraphAdjList;                          //定义一个图
    
    typedef struct QNode
    {
        ElemType qData;
        struct QNode *nextNode;
    }QNode;                                 //定义队列的结点
    typedef struct QueueList
    {
        QNode *front;
        QNode *rear;
    }QueueList,*queue;                      //定义一个队列
    
    
                                            //初始化队列
    void InitQueue(QueueList *Q)
    {
        Q->front = (QNode*)malloc(sizeof(QNode));
        if( Q->front == NULL )
        {
            printf("Error!");
            exit(0);
        }
        Q->rear = Q->front;
    //    Q->rear = NULL;
        Q->front->nextNode = NULL;
    }
    
                                            //插入一个结点到队列
    void InsertQueue(QueueList *Q,ElemType *e)
    {
        QNode *p;
        p = (QNode *)malloc(sizeof(QNode));
        p->qData = *e;
        p->nextNode = NULL;
        Q->rear->nextNode = p;
        Q->rear = p;
    }
    
                                            //删除队列中的结点(出队列)
    void DeleteQueue(QueueList *Q,ElemType *e)
    {
        QNode *s;
        if(Q->front == Q->rear)
        {
            return;
        }
        s = Q->front->nextNode;
        *e = s->qData;
        Q->front->nextNode = s->nextNode;
        if(Q->front->nextNode == NULL)
        {
            Q->rear = Q->front;
        }
        free(s);
        return;
    }
    
    void CreateGraph(GraphAdjList *G)           //构建一个我们要遍历的图
    {
        int i = 0,j = 0,k = 0;
        EdgeNode *s;
        VertexType c;
        printf("请输入图的顶点数和边数,中间用英文逗号隔开 :
    ");
        scanf("%d,%d",&G->numVertex,&G->numEdge);
        printf("请输入各个顶点中存放的数据:
    ");
        fflush(stdin);
        scanf("%c",&c);
        while(i < G->numVertex)
        {
            if(c == '
    ')
            {
                break;
            }
            G->adjList[i].data = c;
            G->adjList[i].Flag = 0;
            G->adjList[i].vertex = i;
            G->adjList[i].firstedge = NULL;
            i++;
            scanf("%c",&c);
        }
            fflush(stdin);
            for(k = 0;k < G->numEdge;k++)
            {
                printf("请输入边Vi~Vj依附的顶点下标 i 和 j :
    ");
                scanf("%d,%d",&i,&j);
                s = (EdgeNode*)malloc(sizeof(EdgeNode));
                s->adjvex = j;
                s->next = G->adjList[i].firstedge;
                G->adjList[i].firstedge = s;
                s = (EdgeNode*)malloc(sizeof(EdgeNode));
                s->adjvex = i;
                s->next = G->adjList[j].firstedge;
                G->adjList[j].firstedge = s;
            }
    }
                                                //查看邻接表是否构建的正确,这个函数只是为了验证
    void print(GraphAdjList *G)
    {
        int i = 0;
        EdgeNode *p;
        for(i = 0;i < G->numVertex;i++)
        {
            printf("
     %d->",i);
            p = G->adjList[i].firstedge;
            while(p)
            {
                printf("%d->",p->adjvex);
                p = p->next;
            }
            printf("End
    ");
        }
    }
    
                                                //DFS遍历
    void DFSTraverse(GraphAdjList *G,int i)
    {
        int j = 0;
        EdgeNode *p;
        G->adjList[i].Flag = 1;
        printf("%c->",G->adjList[i].data);
        p = G->adjList[i].firstedge;
        while(p != NULL)
        {
            if(G->adjList[p->adjvex].Flag == 0)
            {
                DFSTraverse(G,p->adjvex);
            }
            p = p->next;
        }
    }
                                                //判断队列是否为空
    int QueueEmpty(QueueList *Q)
    {
        if(Q->front == Q->rear)
            return 0;
        else
            return 1;
    }
                                                //BFS遍历
    void BFSTraverse(GraphAdjList *G)
    {
        int i = 0,k = 0,flag = 0;
        EdgeNode *s;
        QueueList Q;
        InitQueue(&Q);
        for(i = 0;i < G->numVertex;i++)
        {
            G->adjList[i].Flag = 0;
        }
        for(i = 0;i < G->numVertex;i++)
        {
            if(G->adjList[i].Flag == 0)
            {
                G->adjList[i].Flag = 1;
    //            printf("%c ",G->adjList[i].data);
                InsertQueue(&Q,&i);
                while(QueueEmpty(&Q))
                {
                    DeleteQueue(&Q,&i);
                    printf("%c->",G->adjList[i].data);
                    s = G->adjList[i].firstedge;
                    while(s != NULL)
                    {
                        k = s->adjvex;
                        if(G->adjList[k].Flag == 0)
                        {
                            G->adjList[k].Flag = 1;
    //                        printf("%c ",G->adjList[k].data);
                            InsertQueue(&Q,&(s->adjvex));
                        }
                        s = s->next;
                    }
    
                }
            }
        }
        printf("End
    ");
    }
    
    int main()
    {
        int k = 0;                               //深度优先遍历从第1个顶点(按输入顺序)开始
        GraphAdjList *G;
        CreateGraph(G);
        printf("
    顶点的邻接表为:
    ");
        print(G);                                //按照头插法得到的邻接表
        printf("
    DFS的结果是:
    ");
        DFSTraverse(G,k);                        //深度优先遍历
        printf("End
    ");
        printf("
    BFS的结果是:
    ");
        BFSTraverse(G);                         //广度优先遍历
        return;
    }
    

      

  • 相关阅读:
    DateGridView 分页显示
    DataGridView 隔行显示不同的颜色
    DataGridview 绘制行序号
    DataGrridView 当前行显示不同颜色
    右键删除行
    【bzoj2763】[JLOI2011]飞行路线 分层图最短路
    【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
    【bzoj1029】[JSOI2007]建筑抢修 贪心+堆
    【bzoj1054】[HAOI2008]移动玩具 Bfs
    【bzoj1911】[Apio2010]特别行动队 斜率优化dp
  • 原文地址:https://www.cnblogs.com/devinblog/p/4177045.html
Copyright © 2020-2023  润新知