图的存储结构

图的存储结构

邻接矩阵

邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。

用邻接矩阵表示法表示图,除了一个用千存储邻接矩阵的二维数组外, 还需要用一个一维数 组来存储顶点信息。 其形式说明如下:

//-----图的邻接矩阵存储表示-----
#define Maxint 32767      //表示极大值
#define MVNum 100         //最大顶点数
typedef char VerTexType;  //假设顶点的数据类型为字符型
typedef int ArcType;
typedef struct
{
  VerTexType vexs [MVNum] ;     //顶点表
  ArcType arcs[MVNum] [MVNum];  //邻接矩阵
  int vexnum,arcnum;            //图的当前点数和边数
                     }AMGraph; 

采用邻接矩阵表示法创建无向网

【算法步骤】

  1. 输入总顶点数和总边数。
  2. 依次输入点的信息存入顶点表中。
  3. 初始化邻接矩阵,使每个权值初始化为极大值。
  4. 构造邻接矩阵。依次输入每条边依附的顶点和其权值,确定两个顶点在图中的位置之后, 使相应边赋予相应的权值,同时使其对称边赋予相同的权值。

【算法描述】

Status CreateUDN(AMGraph &G) 
{//采用邻接矩阵表示法,创建无向网G
  cin>>G.vexnum>>G.arcnum; 
  for(i=O;i<G.vexnum;++i) 
     cin>>G.vexs[i); 
  for(i=O;i<G.vexnum;++习
     for (j =0; j <G. vexnum; ++j) 
         G.arcs[i) [j)=Maxint;
  for(k=O;k<G.arcnum;++k) 
   {
       cin>>vl>>v2>>w;
       i=LocateVex(G,vl);j=LocateVex(G,v2); //确定vl和v2在G中的位置,即顶点数组的下标
       G.arcs[i][j]=w; //边<vl, v2>的权值置为w
       G.arcs[j] [i]=G.arcs[i][j];
   }
   return OK; 
                    }

邻接矩阵表示法的优缺点

(1)优点 :便于判断两个顶点之间是否有边, 即根据A[i] [j]= 0或1来判断; 便于计算各个顶点的度。

(2) 缺点:不便于增加和删除顶点;不便于统计边的数目,需要扫描邻接矩阵所有元素才能统计完毕;空间复杂度高。

邻接表

邻接表(Adjacency List) 是图的一种链式存储结构。在邻接表中,对图中每个顶点Vi建立一个单链表,把与 Vi相邻接的顶点放在这个链表中。邻接表中每个单链表的第一个结点存放有关顶点的信息, 把这一结点看成链表的表头, 其余结点存放有关边的信息, 这样邻接表便由两部分组成:表头结点表和边表。

(1) 表头结点表:由所有表头结点以顺序结构的形式存储, 以便可以随机访问任一顶点的边链表。表头结点包括数据域 (data)链域 (firstarc) 两部分

(2)边表:由表示图中顶点间关系的 2n个边链表组成。 边链表中边结点包括邻接点域 (adjvex)、数据域 (info) 和链域 (nextarc) 三部分

邻接表存储结构说明如下:

//- - - - -图的邻接表存储表示- ----
#define MVNum 100           //最大顶点数
typedef struct ArcNode      //边结点
{ 
   int adjvex;              //该边所指向的顶点的位置
   struct ArcNode * nextarc; //指向下一条边的指针
   Otherinfo info;           //和边相关的信息
}ArcNode; 
typedef struct VNode         //顶点信息
{ 
   VerTexType data;          //指向第一条依附该顶点的边的指针
 ArcNode *firstarc; 
}VNode,AdjList[MVNum]; 
typedef struct 
{
  AdjList vertices; 
  int vexnum,arcnum; 
}ALGraph;

邻接表表示法的优缺点

(1) 优点:

便于增加和删除顶点;

便于统计边的数目, 按顶点表顺序扫描 所有边表可得到边的数目,时间复杂度为 O(n + e) ;

空间效率高。对于一个具有n个顶点e条边的图 G, 若 G 是无向图,则在其邻接表表示 中有 n 个顶点表结点和 2e 个边表结点;若 G 是有向图,则在它的邻接表表示或逆邻接表表示中均有 n 个顶点表结点和e个边表结点。

(2)缺点 :

不便于判断顶点之间是否有边,要判定 Vi和vj之间是否有边,就需扫描第i个边表,最坏情况下要耗费 O(n)时间;

不便于计算有向图各个顶点的度。

posted @   青菜的宝贝  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇
点击右上角即可分享
微信分享提示