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/

  • 相关阅读:
    关于研发核心团队建设的一些思考
    无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
    自适应网页设计(Responsive Web Design)
    css浮动与绝对定位小记
    WEB进度条控件
    GitHub上整理的一些工具
    雾里看花般的迷茫--货运APP
    揭秘史上最完美一步到位的搭建Andoriod开发环境
    我是如何在SQLServer中处理每天四亿三千万记录的
    货运APP产品魔力=卓越功能×情感诉求
  • 原文地址:https://www.cnblogs.com/xryz/p/4848009.html
Copyright © 2011-2022 走看看