zoukankan      html  css  js  c++  java
  • 图的储存

    /* 图的邻接矩阵表示法(C语言实现) */
    #define  MaxVertexNum  100      /* 最大顶点数设为100 */
    #define  INFINITY  65535     /* ∞设为双字节无符号整数的最大值65535*/
    typedef  char  VertexType;      /* 顶点类型设为字符型 */
    typedef  int  EdgeType;         /* 边的权值设为整型 */
    enum GraphType { DG, UG, DN, UN };  
    /* 有向图,无向图,有向网图,无向网图*/
    
    typedef  struct {
        VertexType  Vertices[ MaxVertexNum ];  /* 顶点表 */
        EdgeType  Edges[ MaxVertexNum ][ MaxVertexNum ]; 
    /* 邻接矩阵,即边表  */
        int  n, e;   /* 顶点数n和边数e */
        enum GraphType GType;   /* 图的类型分4种:UG、DG、UN、DN */
    } MGraph;    /* MGragh是以邻接矩阵存储的图类型 */
    
    void  CreateMGraph ( MGraph *G )
    {  
        int  i, j, k, w;
        G-> GType = UN;    /* Undirected Network  无向网图  */
        printf( "请输入顶点数和边数(输入格式为:顶点数, 边数):
    " );
        scanf( "%d, %d",&(G->n), &(G->e) ); /* 输入顶点数和边数 */
        printf("请输入顶点信息(输入格式为:顶点号<CR>):
    ");
        for ( i = 0; i < G->n; i++ ) 
           scanf( "%c",&(G-> Vertices[i]) ); /*  输入顶点信息,建立顶点表  */
        for ( i = 0; i < G->n; i++ )
           for ( j = 0; j < G->n; j++ )  
               G->Edges[i][j] = INFINITY; /* 初始化邻接矩阵 */
        printf( "请输入每条边对应的两个顶点的序号和权值,输入格式为:i, j, w:
    " );
        for ( k = 0; k < G->e; k++ ) {
           scanf("%d,%d,%d ",&i, &j, &w); /* 输入e条边上的权,建立邻接矩阵 */
           G->Edges[i][j] = w; 
           G->Edges[j][i] = w; /* 因为无向网图的邻接矩阵是对称的 */
        }
    }
    /* 图的邻接表表示法(C语言实现) */
    #define  MaxVertexNum  100     /* 最大顶点数为100 */
    enum GraphType { DG, UG, DN, UN }; 
    /* 有向图,无向图,有向网图,无向网图*/
    typedef  struct  node{   /* 边表结点 */
        int AdjV;            /* 邻接点域 */
        struct  node  *Next;  /* 指向下一个邻接点的指针域 */
        /* 若要表示边上的权值信息,则应增加一个数据域Weight */
    } EdgeNode;
    typedef  char  VertexType;   /* 顶点用字符表示 */
    typedef  struct  Vnode{      /* 顶点表结点 */
        VertexType  Vertex;      /* 顶点域 */
        EdgeNode  *FirstEdge; /* 边表头指针 */
    } VertexNode; 
    typedef VertexNode AdjList[ MaxVertexNum ]; /* AdjList是邻接表类型 */
    typedef  struct{  
        AdjList  adjlist;    /* 邻接表 */
        int  n, e;               /* 顶点数和边数 */
        enum GraphType GType;    /* 图的类型分4种:UG、DG、UN、DN */
    } ALGraph;  /*ALGraph是以邻接表方式存储的图类型 */
    
    void CreateALGraph( ALGraph *G )
    {
        int i, j, k;
        EdgeNode *edge;
        G-> GType = DG;  /* Directed Graph  有向图  */
        printf( "请输入顶点数和边数(输入格式为:顶点数,边数):
    " );
        scanf( "%d,%d", &(G->n), &(G->e) ); /* 读入顶点数和边数 */ 
        printf( "请输入顶点信息(输入格式为:顶点号<CR>):
    " );
        for ( i=0; i < G->n; i++ ) {   /* 建立有n个顶点的顶点表 */
            scanf( " %c", &(G->adjlist[i].Vertex) );  /* 读入顶点信息 */
           G->adjlist[i].FirstEdge = NULL; /* 顶点的边表头指针设为空 */
        }
        printf( "请输入边的信息(输入格式为: i, j <CR>):
    " );
        for ( k=0; k < G->e; k++ ){   /* 建立边表 */
           scanf( "
    %d,%d", &i, &j); /* 读入边<vi,vj>的顶点对应序号*/
           edge = (EdgeNode*)malloc(sizeof(EdgeNode)); /* 生成新边结点edge */
           edge->AdjV = j; /* 邻接点序号为j */
           edge->Next = G->adjlist[i].FirstEdge;
           /* 将新边表结点edge插入到顶点vi的边表头部 */
           G->adjlist[i].FirstEdge = edge;
           /* 若是无向图,还要生成一个结点,用来表示边< vj, vi>  */
        }
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/xryz/p/4848009.html
Copyright © 2011-2022 走看看