图的存储及基本操作 ---- 邻接表法

1、

  》》当一个图为稀疏图时,使用邻接矩阵表示法显然要浪费大量的存储空间。而图的邻接表法结合了

   “ 顺序存储 ” 和 “ 链式存储 ” 方法,大大减少了这种不必要的浪费。

 》》 所谓邻接表就是对图G中的每个顶点 Vi 建立一个单链表,第 i 个单链表中结点表示依附

   顶点 Vi的边(对于有向图则是以顶点 Vi 的弧),这个单链表就称为顶点 Vi 的边表

   (对于有向图则称为“ 出边表 ”)。

     边表的头指针和顶点的数据信息采用顺序存储(称为顶点表),所以在邻接表中存在两种结点:

   “ 顶点表法 ” 和 “ 边表结点 ”

       

    补充1:顶点表结点由 “ 顶点域(data)”和“ 指向第一条邻接边的指针(firstarc)”构成

              补充2: 边表(邻接表)结点由“ 邻接点域(adjvex)” 和 “ 指向下一条邻接边的指针域(nextarc)”构成。

  》》无向图邻接表法的示例:

              

       》》 有向图邻接标法的实例:

                  

        》》 图的邻接表存储结构定义如下:

                

#define MaxVertexNum 100                         // 图中顶点数目的最大值
typedef struct ArcNode{                          // 边表结点
     int adjvex;                                 // 该弧所指向的顶点的位置
     struct ArcNode *next;                       // 指向下一条弧的指针
     // InfoType info ;                          // 网的权值                         
}ArcNode;

typedef struct VNode{                             // 顶点表结点
     VertexType data;                             // 顶点信息
     ArcNode *first;                              // 指向第一条依附该顶点的弧的指针
}VNode , AdjList[MaxVertexNum];

typedef struct{
     AdjList vertices;                            // 邻接表
     int vexnum , arcnum ;                        // 图的顶点数和弧数
}ALGraph;                                         // ALGraph 是以邻接表存储的图类型

          》》图的邻接表存储方法具有以下特点:

    1)、如果图G为无向图,则所需要的存储空间为O( |V| + 2|E| ) ;

                         如果图 G 为有向图,则所需要的存储空间为 O( |V| + |E| )

               2)、对于稀疏图,采用邻接表表示将极大地节省存储空间。

               3)、在邻接表中,给定一顶点,能很容易地找到它的所有边,因为只需要读取它的邻接表就可以了。

                     在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为 O( n ) 。

                         但是,如果要确定给定的两个顶点间是否存在边,则在邻接矩阵里可以立刻查到,在邻接表中

                      则需要在相应结点对应的边表中查找另一个结点,效率较低。

               4)、在有向图的邻接表表中,求一个给定顶点的出度只需要计算其邻接表中的结点个数即可;但是

                      求其顶点的入度,则需要遍历全部的邻接表。因此,也有人采用逆邻接表的存储方式来加速求解

                      给定顶点的入度。当然,这实际上与邻接表存储方式是类似的。

               5)、图的邻接表表示并不唯一,这是因为在每个顶点对应的单链表中,各边结点的链接次序可以是

                        任意的,取决于建立邻接表的算法以及边的输入次序。

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小达人Fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值