• 图的存储结构


        图的结构比较复杂,任意两个顶点之间都可能有联系,因此无法以数据元素在存储区中的物理位置来确定元素的关系,所以图没有顺序映像的存储结构,但是可以借助数组的数据类型来表示元素之间的关系。

        另一方面,用多重链表表示图是自然的事,他是一种最简单的链式映像存储结构,即由一个数据域和多个指针域组成的节点表示图中的一个顶点,其中数据域存放顶点的信息,指针域指向其邻接点的指针。

       图有以下几种存储结构

      1 数组表示法

      用两个数组分表存储图的顶点信息和数据元素之间的关系(也就是图的边或弧的信息)

      形式如下:

      --------------图的数组(领教矩阵)存储表示-----------

      #define infinity int_max;//最大值

      #define max_vertex_num 20;//最大的顶点数

      #define enum {dg,dn,udg,udn} graphKine;//图的类别:有向图,有向网,无向图,无向网

      typedef struct ArcCell

      {

      VRType adj;//顶点的关系类型,对无权图,用1或0表示是否相邻,如果是有权图,表示为权值

      InfoType *info;//该弧表示的信息

      }ArcCell,AdjMatrix[max_vertex_num][max_vertex_num];

      typedef struct

      {

       VertexType vexs[max_vertex_num];//顶点信息的数组

       AdjMatrix  arcs;//邻接矩阵,也就是弧(边)的信息二维数组

       int  vexnum,arcnum;//图的顶点数和弧数

       GraphKind kind;//图的类型

      }MGraph;

      从结构上讲就是用一个二维数组(邻接矩阵)来存储图的弧(边)的信息,用一个一维数组存储图的顶点信息。

    如果是无权图,邻接矩阵里面只存储0或1的数据,来表示两个顶点之间是否有联系

      1   2  3

    1【0,1,1】

    2【0,0,0】

    3【1,0,0】比如该矩阵,从下标1开始描述数组,那就是第一个顶点和第二个顶点有联系,第一个顶点和第三个顶点有联系,第三个和第一个有联系。第2个和第一个没联系(那是因为有可能图是有向图,从顶点1到2有箭头联系,从顶点2到1却没有箭头)。所以如果图是无向图的话,可以只存储矩阵上三角或者下三角元素,因为在无向图中从顶点1和顶点2之间有联系,但是没有箭头指向。

    如果是有权图,则上面矩阵中1应该变成从顶点1到顶点2之间这个弧的具体权值,而不是单纯的1.如果之间没有边,没有联系,那就要用一个特殊的符号(比如#,∞)来表示这个两个顶点之间没有边或弧。(但是不能用0,因为0也是一个数值,也可以是弧的权值数值)

    2 邻接表

     邻接表是图的一种链式存储结构。在邻接表中对图中的每个顶点建立一个单链表(比如图有4个顶点,就要建立4个单链表),第i个单链表依附于图的第i个顶点(如果是有向图就是以顶点i为弧尾的边)。在这个单链表上的每个结点有3个域:

    表结点:

    adjvex:int类型,指示该弧指向的顶点的位置

    nextarc:指示下一个弧的指针,和表结点是同样的数据类型;(存储的是和顶点i直接有关联的弧信息,比如a->b,a->c。就存储指向b和指向c的指针,如果b或c还指向了其他顶点,在以a顶点建立的单链表中不存储b和c指向的顶点,只存储a直接指向的顶点信息,不存储间接相连的顶点信息。)

    info:存储弧或边的数据信息。

    另外还有一个链头结点:有两个域:data:存储顶点数据;firstarc:指向第一条依附该顶点的弧的指针和上面的表结点类型相同。

    -----------------存储代码---------------

    #define max_vertex_num 20p

    typedef struct ArcNode

    {

    int adjvex;

    struct ArcNode *nextarc;

    InfoType *info;

    }ArcNode;

    type struct VNode

    {

     VertexType data;

    ArcNode *firstarc;

    }Vnode,AdjList[max_vertex_num];

    typedef struct

    {

    AdjList vertices;

    int vexnum,arcnum;//图的顶点数,弧数

    int kind;//图的种类标示

    }ALGraph;

    有时候为了方便确定顶点入度或以顶点i为头的弧(针对有向图来说),则需要建立以顶点i为头的弧的链表。这称为逆邻接表

    邻接表和逆邻接表可以方便的查询图中一个顶点的入度和出度

     3 十字链表

      在十字链表中(有向图适用,有向图才有弧头和弧尾的概念),每条弧有一个结点,每个顶点也有个结点。

    -------------存储结构和结点的结构说明---------

    #define max_vertex_num 20;

    typedef struct ArcBox//弧结点

    {

     int tailvex,headvex;//该弧的尾,头顶点在图中的位置

     struct ArcBox *hlink,&tlink;//分别是弧头相同,弧尾相同的弧的指针

     InfoType *info;//该弧的信息

    }

    typedef struct vexNode//顶点结点

    {

    vertexType data;//顶点数据

    ArcBox *firstIn,*firstOut;//分别指向该顶点的第一个入弧和出弧

    }vexBode;

    typedef struct

    {

    vexnode xlist[max_vertex_num];//表头变量,顶点数组

    int vexnum,arcnum;//顶点数量,弧数量

    }OlGraph//图整体概念结构

    4.邻接多重表

      这个结构是无向图的链式存储结构。和十字链表很相似,但是添加一个是否访问过的标示。

    ---------------存储结构------------

    #define max_vertex_num 20

    type enum{unvisited,visited }visitIf;

    typedef struct EBox

    {

     visitIf mark;//访问标示

    int ivex,jvex;//该边依附的两个顶点的位置。

    struct EBox *ilink,*jlink;//ilink表示依附顶点ivex的边,jlink表示依附顶点jvex的边

    Infotype *info;//边信息

    }EBox;

    typedef struct vexBox

    {

    verterType data;

    EBox *firstedge;//指向第一条依附该顶点的边

    }VexBox;

    typedef struct

    {

    vexbox adjmulist[max_vertex_num];

    int vexnum,edgenum;//无向图的顶点数和边数

    }AMLGraph;

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。
    sqlserver 2005 分布式架构 对等事务复制 .
    兼容级别
    Delphi中的INI文件编程
    金正昆谈礼仪之西餐礼仪zt
    WOW UI定制基本资料初学者指南 被一个疯狂迷恋魔兽的兄弟逼死了,不得以,沦落的作些小脚本,失败呀
    相爱与相知
    情欲信,而词欲巧
    周日去看F1:)
    当程序用ado的jet4.0方式连接的时候,对于设有access数据库密码的mdb的访问居然报错“无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开”,而用odbc方式不报错,小阴沟里翻船,郁闷中然后查文档解决之
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319369.html
Copyright © 2020-2023  润新知