问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

图的存储结构——所存储的信息有哪些?

发布网友 发布时间:2022-04-23 02:16

我来回答

2个回答

好二三四 时间:2022-07-11 22:00

1、邻接矩阵:逻辑结构分为两部分:V和E集合。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系的数据,这个二维数组称为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。

2、邻接表:是由单链表的表头形成的顶点表和单链表其余结点形成的边表两部分组成。

3、十字链表:是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。

4、邻接多重表:主要用于存储无向图。

热心网友 时间:2024-02-17 12:14

一、邻接矩阵存储方法

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

设G=(V,E)是具有n(n>0)个顶点的图,顶点的顺序依次为0~n-1,则G的邻接矩阵A是n阶方阵,其定义如下:

(1)如果G是无向图,则:

      A[i][j]=1:若(i,j)∈E(G)   0:其他

(2)如果G是有向图,则:

      A[i][j]=1:若<i,j>∈E(G)  0:其他

(3)如果G是带权无向图,则:

      A[i][j]= wij :若i≠j且(i,j)∈E(G)    0:i=j    ∞:其他

(4)如果G是带权有向图,则:

      A[i][j]=  wij :若i≠j且<i,j>∈E(G)   0:i=j ∞:其他

注意:带权图和不带权图表示的元素类型不同。


带权图(不论有向还是无向图)A[i][j]用double表示,不带权图(不论有向还是无向图)A[i][j]用int表示。

用一维数组G[ ]存储有4个顶点的无向图如:G[ ] = { 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 }

则顶点2和顶点0之间是有边的。

如:

邻接矩阵的特点如下:

(1)图的邻接矩阵表示是唯一的。

(2)无向图的邻接矩阵一定是一个对称矩阵。因此,按照压缩存储的思想,在具体存放邻接矩阵时只需存放上(或下)三角形阵的元素即可。

(3)不带权的有向图的邻接矩阵一般来说是一个稀疏矩阵。因此,当图的顶点较多时,可以采用三元组表的方法存储邻接矩阵。

(4)对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。

(5)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。

(6)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性。

邻接矩阵的数据类型定义如下:

#define  MAXV  <最大顶点个数>

typedef struct 

{  int no;//顶点编号

   InfoType info;//顶点其他信息

} VertexType;//顶点类型

typedef struct  //图的定义

{  int edges[MAXV][MAXV]; //邻接矩阵

   int n,e;  //顶点数,弧数

   VertexType vexs[MAXV];//存放顶点信息

} MGraph;//图的邻接矩阵表示类型


二、 邻接表存储方法

图的邻接表存储方法是一种顺序分配与链式分配相结合的存储方法。

在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点i的边(对有向图是以顶点i为尾的边)。每个单链表上附设一个表头节点。

其中,表节点由三个域组成,adjvex指示与顶点i邻接的点在图中的位置,nextarc指示下一条边或弧的节点,info存储与边或弧相关的信息,如权值等。

表头节点由两个域组成,data存储顶点i的名称或其他信息,firstarc指向链表中第一个节点。 

typedef struct ANode

{  int adjvex;//该边的终点编号

   struct ANode *nextarc;//指向下一条边的指针

   InfoType info;//该边的相关信息

} ArcNode;//边表节点类型


typedef struct Vnode

{  Vertex data;//顶点信息

   ArcNode *firstarc;//指向第一条边

} VNode;//邻接表头节点类型

typedef VNode AdjList[MAXV];//AdjList是邻接表类型

typedef struct 

{  AdjList adjlist;//邻接表

   int n,e;//图中顶点数n和边数e

} ALGraph;//完整的图邻接表类型         


邻接表的特点如下:

(1)邻接表表示不唯一。这是因为在每个顶点对应的单链表中,各边节点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。

(2)对于有n个顶点和e条边的无向图,其邻接表有n个顶点节点和2e个边节点。显然,在总的边数小于n(n-1)/2的情况下,邻接表比邻接矩阵要节省空间。

(3)对于无向图,邻接表的顶点i对应的第i个链表的边节点数目正好是顶点i的度。

(4)对于有向图,邻接表的顶点i对应的第i个链表的边节点数目仅仅是顶点i的出度。其入度为邻接表中所有adjvex域值为i的边节点数目。

例, 给定一个具有n个节点的无向图的邻接矩阵和邻接表。

(1)设计一个将邻接矩阵转换为邻接表的算法;

(2)设计一个将邻接表转换为邻接矩阵的算法;

(3)分析上述两个算法的时间复杂度。

解:

(1)在邻接矩阵上查找值不为0的元素,找到这样的元素后创建一个表节点并在邻接表对应的单链表中采用前插法插入该节点。

void MatToList(MGraph g,ALGraph *&G)

//将邻接矩阵g转换成邻接表G

{  int i,j,n=g.n; ArcNode *p; //n为顶点数

   G=(ALGraph *)malloc(sizeof(ALGraph));

   for (i=0;i<n;i++)     //给所有头节点的指针域置初值

      G->adjlist[i].firstarc=NULL;

   for (i=0;i<n;i++)//检查邻接矩阵中每个元素

      for (j=n-1;j>=0;j--)

         if (g.edges[i][j]!=0) 

         {  p=(ArcNode *)malloc(sizeof(ArcNode)); 

                       //创建节点*p

      p->adjvex=j;

      p->nextarc=G->adjlist[i].firstarc;

                       //将*p链到链表头

      G->adjlist[i].firstarc=p;

   }

   G->n=n;G->e=g.e;


}


(2)在邻接表上查找相邻节点,找到后修改相应邻接矩阵元素的值。

     void ListToMat(ALGraph *G,MGraph &g)

  {  int i,j,n=G->n;ArcNode *p;

     for (i=0;i<n;i++) 

     {  p=G->adjlist[i].firstarc;

        while (p!=NULL) 

  {   g.edges[i][p->adjvex]=1;

      p=p->nextarc;

  }

     }

     g.n=n;g.e=G->e;

  } 


(3)算法1的时间复杂度均为O(n2)。算法2的时间复杂度为O(n+e),其中e为图的边数。

热心网友 时间:2024-02-17 12:14

无向图的边的矩阵一定是一个对称矩阵,因为无向图只关心边是否存在,而不关心方向,V0和V1有边,那么V1和V0也有边。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 苹果7p绑定小米手环2显示“绑定失败,请将手环贴近手机后重试”,这是 我想在网上买点普洱茶喝,不知道那家店能买到好茶叶,了解的朋友给我推荐几家店铺。 数据结构最小生成树问题 小米手环怎么连接iPhone手机的健康应用? 怎么购买普洱茶 数据结构——图 小米note照片设为私密照片怎么打开 在网上买普洱茶在哪里比较好,淘宝还是网站? 苹果手机怎么和小米手环怎么连接 小米note8pro私密照片怎么打开? 最小生成树怎么求 如何在网上购买茶叶? 小米手环2的解锁能够在iphone上用吗 小米私密相册怎么找 哈密尔顿图遍历 网上哪里买普洱茶靠谱点?大神们帮帮忙 小米手环如何跟iPhone手机连接 小米note全网通手机怎么加密相册 无向网的邻接矩阵,怎么不能正确输出? 苹果6S手机如何重新配对被忽略了的小米手环2? 哪里可以买到好的普洱茶 数据结构中关于最小生成树的步骤 小米手环怎么绑定苹果手机 小米note手机相册里面的私密相册里面的图片都没有了怎么找回。急!急... 数据结构 图的遍历 ps3蓝牙手柄连接手机有哪些步骤 小米note 的图片设置成私密相册后怎么找到私密相册? c语言数据结构 PS3手柄怎么连接智能手机 数据结构:输入两个数给m,n分别表示图的结点数和边数,建立图的邻边矩阵 安卓手机蓝牙怎么连接ps3手柄? 哪位大神能告诉我小米note私密相册在那里打开 邻接矩阵的表示法 ps3游戏手柄怎么连接安卓手机 红米note手机隐藏了相册怎么弄出来? 索尼ps3蓝牙游戏手柄手机能用吗? ps3蓝牙手柄能连接安卓手机吗? sonyps3手柄怎么连接手机 PS3手柄可以连接MTK的安卓手机吗 PS3手柄连接手机玩游戏,如何设置手柄?