图(一):图的定义和存储结构

图的定义

ADT Graph{
    数据对象 v:相同特性数据元素的集合,称为顶点集
    数据关系 R:
        R = { VR }
        VR = {<v,w>|v,w∈V且P(v,w),<v,w>标识v到w的弧}
    基本操作:
        CreatGraph(&G,V,VR)     //创建图
        DestoryGraph(&G)        //销毁图
        等等……
}
  • 图的分类
    • 有向图、无向图
    • 完全图:边的数目为最大值
    • 稠密图(边数 > nlogn)、稀疏图(边数 < nlogn)
    • 连通图:图中任意两点是连通的
    • 强连通图:有向图中任意两点是连通的
  • 权值:图的边上有一个与他相关的数
  • 顶点的度:与顶点V相关联的边的数目
    • 入度:以 V 为头的边的数目
    • 出度:以 V 为尾的变得数目
    • 握手定理:所有顶点的度数之和为 边数 的两倍

图的存储结构

  • 数组表示法(邻接矩阵存储)
    • 使用两个数组分别存储顶点的信息和数据元素之间的关系的信息
    #define NUM 20
    typedef struct ArcCell{
        VRType adj;     // VRType 表示顶点关系类型,对无权图,0或1
        InfoType *info;     //该边相关信息指针
    }AdjMatrix[NUM][NUM]
    typedef struct{
        VertexType vexs[NUM];   //顶点向量
        AdjMatrix arcs;         //邻接矩阵
        int vexnum,arcnum;      //顶点数和边数
    }
    
  • 邻接表
    • 链式存储结构,
      • 每个结点三个域组成
        • 邻接点域 adjvex:该弧指向的顶点位置
        • 链域 nextarc:指向下一条弧的结点
        • 数据域 info:该户相关信息的指针,如权值
      • 表头结点
        • 数据域 data:顶点信息
        • 链域 firstarc:指向链表中的第一个结点
    • 每个顶点建立一个单链表
    #define MAX_VERTEX_NUM 20
    
    typedef struct ArcNode{
        int adjvex;                 //该弧指向的顶点位置
        struct ArcNode *nextarc;    //指向下一条弧的指针
        InfoType *info;             //该弧相关信息的指针
    }ArcNode;
    
    typedef struct VNode{
        VertexType data;            //顶点信息
        ArcNode *firstarc;           //指向第一条依附于该顶点的指针
    }VNode,AdjList[MAXMAX_VERTEX_NUM];
    
    typrdef struct{
        AdjList vertices;           //顶点数组
        int vexnum,arcnum;          //图的当前顶点数和弧数
        int kind;                   //图的种类标志
    }ALGraph;
    
  • 十字链表
    • 十字链表是有向图的另一种的存储结构
    • 结点结构
      • 弧结点
        • 尾域 tailvex:指示弧尾在图中的位置
        • 头域 headvex:指示弧头在图中的位置
        • 链域 hlink:指向弧头相同的下一条弧
        • 链域 tlink:指向弧尾相同的下一条弧
        • info域 info:指向该弧的相关信息
      • 顶点结点
        • 数据域 data:存储顶点相关信息
        • 链域 firstin:指向以该顶点弧头的第一个弧结点
        • 链域 firstout:指向以该顶点弧尾的第一个弧结点
    #define MAX_VERTEX_NUM 20
    
    typedef struct ArcBox{
        int tailbex,headvex;            //该弧的尾和头顶点的位置
        struct ArcNode *hlink,*tlink;   //分别尾弧头相同和弧尾相同的链域
        InfoType *info;                 //该弧相关信息的指针
    }ArcBox;
    
    typedef struct VexNode{
        VertexType data;                        //顶点信息
        ArcNode *firstin,*firstout;             //指向第一条入弧和出弧
    }VexNode;
    
    typrdef struct{
        VexNode xlist[MAX_VERTEX_NUM]         //表头向量
        int vexnum,arcnum;          //图的当前顶点数和弧数
    }OLGraph;     
    
  • 邻接多重表
    • 邻接多重表是无向图的另一种链式存储结构
    • 每一条边用一个结点表示:
      • 标志域 mark:标记是否被遍历
      • 该边的两个顶点在如中位置 ivex,jvex
      • ilink、jlink :指向下一条依赖该顶点的边
      • info:指向和边相关的各种信息
    • 每个顶点也使用一个结点表示:
      • data:存储与该结点相关的信息
      • firstedge:指向第一条依附该顶点的边
    #define MAX_VERTEX_NUM 20
    typedef enum{unvisited,visited} VisitIf;
    typedef struct EBox{
        VisitIf mark;                   //访问标记
        int ivex,jvex;                  //该边依附的两个顶点位置
        struct EBox *ilink,*jlink;      //分别指向下一依附这两个顶点的边
        InfoType *info;                 //该边的信息指针
    }EBox;
    
    typedef struct VexBox{
        VertexType data;                //顶点信息
        ArcNode *firstedge;             //指向第一条边
    }VexBox;
    
    typrdef struct{
        VexBox adjmulistlist[MAX_VERTEX_NUM]    //表头向量
        int vexnum,edgenum;                      //图的当前顶点数和弧数
    }AMLGraph;  
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值