zoukankan      html  css  js  c++  java
  • 基于邻接矩阵的图的建立与遍历

    以上图为例,通过邻接矩阵的方式存储该图,并写出建立图和遍历图的代码``

    代码的实现比较简单和基础,主要用于巩固和复习数据结构相关知识。

    #include <stdio.h>
    #include <string.h>
    
    #define MAX_VERTEX_NUM 100
    #define MAX_VERTEX_NAMELEN 100
    
    typedef struct{
        char name[MAX_VERTEX_NAMELEN];
    }VerType;
    
    // 图的邻接矩阵存储结构
    typedef struct{
        int VertexNum,EdgeNum;                        // 顶点数,边数
        VerType Vertex[MAX_VERTEX_NUM];               // 顶点集
        int Edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];     // 边集
    }MGragh;
    
    // 记录顶点的访问信息
    int visit[MAX_VERTEX_NUM];
    
    //********************************************************//
    //                    邻接矩阵建图                          //
    //********************************************************//
    
    void CreateMGragh(MGragh *Gra)
    {
        int i,j,k;
        char v1[MAX_VERTEX_NAMELEN],v2[MAX_VERTEX_NAMELEN];
    
        printf("请输入顶点数及边数(顶点数 边数)
    ");
        scanf("%d %d%*c",&(Gra->VertexNum),&(Gra->EdgeNum));
    
        printf("请输入顶点信息
    ");
        for (i=0; i<Gra->VertexNum; i++){
            printf("%d.",i+1);
            gets(Gra->Vertex[i].name);
        }
    
        // 初始化邻接矩阵
        for (i=0; i<Gra->VertexNum; i++){
            for (j=0; j<Gra->VertexNum; j++){
                Gra->Edge[i][j] = 0;
            }
        }
        printf("请输入边信息(顶点,顶点)
    ");
        for (i=0; i<Gra->EdgeNum; i++){
            printf("%d.",i+1);
            scanf("%[^,]%*c%[^
    ]%*c",v1,v2);
            for (j=0; j<Gra->VertexNum; j++){
                for (k=0; k<Gra->VertexNum; k++){
                    if (strcmp(Gra->Vertex[j].name,v1) == 0 && strcmp(Gra->Vertex[k].name,v2) == 0){
                        Gra->Edge[j][k] = Gra->Edge[k][j] = 1;
                    }
                }
            }
        }
    }
    
    //********************************************************//
    //                   深度优先遍历                           //
    //********************************************************//
    
    void DFS(MGragh *Gra,int sub)
    {
        printf("%s",Gra->Vertex[sub].name);
        visit[sub] = 1;
        for (int i=0; i<Gra->VertexNum; i++){
            if (Gra->Edge[sub][i] == 1 && visit[i] == 0){
                DFS(Gra,i);
            }
        }
    }
    
    void DFSTraverse(MGragh *Gra)
    {
        int i;
    
        // 初始化
        for (i=0; i<Gra->VertexNum; i++){
            visit[i] = 0;
        }
    
        for (i=0; i<Gra->VertexNum; i++){
            if (visit[i] == 0){
                DFS(Gra,i);
                printf("
    ");
            }
        }
    }
    
    //********************************************************//
    //                   广度优先遍历                           //
    //********************************************************//
    
    typedef struct{
        int first;
        int last;
        int que[MAX_VERTEX_NUM];                
    }Queue;
    
    void initQueue(Queue *q)                            // 初始化队列
    {
        q->first = q->last = 0;
    }
    int QueueEmpty(Queue *q)                            // 判断队列为空
    {
        return q->last==q->first;
    }
    int QueueFull(Queue *q)                             // 判断队列为满
    {
        return (q->last-q->first) == MAX_VERTEX_NUM;
    }
    void DeQueue(Queue *q,int *i)                       // 出队
    {
        *i = q->que[q->first];
        q->first = (q->first+1)%MAX_VERTEX_NUM;
    }
    void EnQueue(Queue *q,int i)                        // 入队
    {
        q->que[q->last] = i;
        q->last = (q->last+1)%MAX_VERTEX_NUM;
    }
    
    void BFSTraverse(MGragh *Gra)
    {
        int i,j,k;
        Queue q;
        
        // 初始化
        for (i=0; i<Gra->VertexNum; i++){
            visit[i] = 0;
        }
    
        initQueue(&q);
        for (i=0; i<Gra->VertexNum; i++){
            if (visit[i] == 0){
                visit[i] = 1;
                EnQueue(&q,i);
    
                while(!QueueEmpty(&q)){
                    DeQueue(&q,&k);
                    printf("%s",Gra->Vertex[k].name);
                    for (j=0; j<Gra->VertexNum; j++){
                        if (Gra->Edge[k][j] == 1 && visit[j] == 0){
                            visit[j] = 1;
                            EnQueue(&q,j);
                        }
                    }
                }
                printf("
    ");
            }
        }
    }
    
    int main()
    {
        MGragh g;
        CreateMGragh(&g);
        
        printf("DFS:");
        DFSTraverse(&g);
        printf("BFS:");
        BFSTraverse(&g);
        
        return 0;
    }

    测试用例与结果:

  • 相关阅读:
    Ubuntu下安装git
    curl: (48) An unknown option was passed in to libcurl怎么解决
    python中如何删除列表中的所有元素
    北京游园有感
    keras 实现人工神经网络
    scikit-learn实现简单的决策树
    angularjs实战
    Ajax实战(原生)
    7.DockerCompose 搭建 Redis
    使用element中的el-upload获取本地文件并转为base64码实现预览
  • 原文地址:https://www.cnblogs.com/raul-ac/p/3256193.html
Copyright © 2011-2022 走看看