首页 / 科技百科

数据结构图的定义和存储结构

2025-05-03 08:27科技百科

图(Graph)是由顶点(图中的结点称为图的顶点)的非空有限集合V(由N0个顶点组成)与边的集合E(顶点之间的关系)所构成的。

根据“存数据存联系”的存储原则,由图的定义可知,图是由顶点和边组成的,因此在存储中,除了要存储结点的信息,还要存储边的信息。

图结构中的结点间没有确定的关系,任意两点之间都可能存在联系,因此无法像树结构那样用顺序结构既存放结点数据,同时又存放结点间的关系,但如果把顶点和边的信息分开存放在顺序结构中,则应该是可以的。

1 图的数组表示法

1.1 邻接矩阵

1.2 边集数组

2 图的链表表示法

2.1 邻接表

2.2 十字链表

2.3 邻接多重表

3 存储结构的比较

1 图的数组表示法

1.1 邻接矩阵

顶点集:一维数组vertex[n] (一个具有n个顶点的图);

1.2 边集数组

顶点集:一维数组;

边集:一维数组(数组元素为结构体);

typedef struct{

VexType start_vex;

VexType end_vex;

InfoType weight;

} EdgeStruct;

EdgeStruct EdgeSet[Edge_MAX_NUM];

2 图的链表表示法

2.1 邻接表

图中的边是由每个顶点Vi与其邻接点构成,每个顶点Vi的所有邻接点构成一个线性表,考虑图的一般情形,对任一顶点Vi来说,邻接点的个数不确定,因此选择用单链表来存储,即对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接结点。

余下为的问题是如何把这n个单链表组织在一起,便于管理。对n个单链表并行管理可以采用“带行向量的链表表示方法”,称为邻接表。邻接表是图的一种链式存储结构,由头结点表和邻接结点链表组成:

头结点表:一维数组(数组元素为结构体,结构体的指针链指向邻接结点链表)

邻接结点链表:链接线性表(单链表)

在有向图中,有入度和出度的概念。有向图的顶点vi的入度是指以顶点vi为终点的弧的数目。顶点vi的出度是指以vi为起始点的弧的数目。入度和出度的和为有有向图顶点vi的度。有向图的邻接表只描述顶点的出度:

有向图的逆邻接表只描述顶点的入度:

实例代码:

#include stdio.h

#include stdlib.h

#define TRUE 1

#define FALSE 0

#define N 8

typedef int VexType;

int AdjMatrix[N][N]=

{{0,1,1,0,0,0,0,0},

{1,0,0,1,1,0,0,0},

{1,0,0,0,0,1,1,0},

{0,1,0,0,0,0,0,1},

{0,1,0,0,0,0,0,1},

{0,0,1,0,0,0,1,0},

{0,0,1,0,0,1,0,0},

{0,0,0,1,1,0,0,0}};

typedef struct Adjnode

{

int adjvex;

struct AdjNode *next;

} AL_AdjNode;

typedef struct

{

VexType vertex;

struct AdjNode *link;

} AL_VexNode;

void Create_AdjList()

{

int i,j;

AL_VexNode VexList[N]={0,NULL};

AL_AdjNode *Ptr,*nextPtr;

for(i=0;iN;i )

{

VexList[i].vertex=i;

VexList[i].link=NULL;

j=0;

while(jN)

{

if(AdjMatrix[i][j]!=0)

{

Ptr=(AL_AdjNode*)malloc(sizeof(AL_AdjNode));

Ptr-adjvex=j;

Ptr-next=NULL;

if(VexList[i].link==NULL)

{

VexList[i].link=Ptr;

nextPtr=Ptr;

}

else

{

nextPtr-next=Ptr;

nextPtr=Ptr;

}

}

j ;

}

}

}

int main()

{

Create_AdjList();

system("pause");

return 0;

}

2.2 十字链表

如果想同时求得有向图某一个顶点的出度和入度,则需要同时存储邻接表和逆邻接表。十字链表也可以理解为将行的单链表和列的单链表结合起来存储稀疏矩阵,每个结点表示一个非零元素。

2.3 邻接多重表

对于无向图,如何设计每条边只出现一次的链表存储形式?可以借鉴边集数组对边的描述方式,一条边为一个边结点,再将边结点之间的联系通过同顶点的线索链接起来即可。由于一条边关联两个顶点,所以一个边结点要设置两个指针域。

邻接多重表的存储结构和十字链表类似,也是由顶点表和边表组成,邻接多重表中,每一条 边的信息用一个结点描述,一条边对应一个边结点。边结点除了边关联的两个顶点ivex、jvex外,再加上与这两个边结点边接接的边结点位置。

在下图中,无向图的边集数组给出了每条边的信息(可以按照起点i在外循环、终点j在内循环,从小到大的顺序排列)。根据边信息,再确定i连接边、j连接边的结点对应位置,如对应边a(v0,v1),起点v0(边集数组中值为0)的连接边为边b(v0,v3),终点v1(边集数组中值为1)的连接边为c(v1,v2)。

如上图所示:

I 边的确定:v0→v1→v2→……确定a→b→c……;

II 在顶点表中,

v0的连接边有a,b,则node *firstedge为a,下一条边*ilink或*jlink为b;

v1的连接边有a,c,d,则node *firstedge为a,下一条边*ilink或*jlink为c或c后的d;

上图的i连接边和j连接边都是本连接边后的第二条连接边(如上图的边表中,i连接边和j连接边都是大于边编号的边);

//邻接多重表的顶点结构

typedef struct vnode

{

VexType vertex;

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

}AML_VertexNode;

//邻接多重表的顶点表

AML_VertexNode G[VERTEX_NUM];

//邻接多重表的边结点结构

typedef struct node

{

int ivex,jvex;

struct node *ilink, *jlink; //分别指向依附于ivex和jvex的下一条边。

}AML_EdgeNode;

3 存储结构的比较

各种存储表示各有利弊,具体应用时,要根据图的稠密和稀疏程序以及运算的要求进行选择。

存储方法实现方法优点缺点关注重点
邻接矩阵二维数组易判断两点间的关系占用空间顶点
容易求得顶点的度
邻接表链表节省空间不易判断两点间的关系顶点
易得到顶点的出度不易得到顶点的入度
十字链表链表空间要求较小结构较复杂
易求得顶点的出度和入度
邻接多重表链表节省空间结构较复杂
易判断两点间的关系

-End-

猜你喜欢

  • 机械之最

    雷柏V700DIY-98机械键盘评测 7层Gasket结构带来极致柔和手感

    【ZOL中关村在线原创评测】随着机械键盘设计和轴体越发丰富,对外设手感要求较高的玩家们已经开始不再满足于传统品牌的几款经典键盘款式和轴体。而是开始寻求手感多样、配列多变、外观设计感更强、满足了个性化需求的客制化键盘。雷柏作为在机械键盘领域扎根多年,为市场带来多款高质量外设的大厂,近期在客制化键盘领域持..

    2025-05-08
  • 历史百科

    陈桥兵变宋太祖赵匡胤推翻后周统治 后世为什么不定义为造反

    此次政变也颇有戏剧性,据史书记载,宋太祖赵匡胤前天夜晚喝醉了,在睡梦中被手下强行披上黄袍,逼他回京师做皇上。我们尚且不说宋太祖赵匡胤酒量怎么,但是他当作军事统帅北上御敌,行事谨慎的宋太祖赵匡胤怎么能做到边走边喝酒?二另一方面,我们来看看此时辽朝在干嘛,据辽史记录,应历九年959十二月,王子迪烈、前宣徽使..

    2025-05-06
  • 世界奇闻

    144集 暗物质寻觅,揭露宇宙结构的关键#天文知识科普视频

    144暗物质寻觅,揭露宇宙结构的关键。欢迎各位热爱宇宙的朋友们回到我们的频道。在今天的科普分享中,我们将深入到宇宙的神秘领域,探索一个对宇宙本身的理解至关重要的话题--暗物质寻觅:揭露宇宙结构的关键。在我们对宇宙的探索历程中,暗物质一直是一个充满挑战而又极其迷人的谜题。尽管暗物质直接的物理性质至今仍不为..

    2025-05-03
  • 科技百科

    数据盘点和数据目录构建方法研究

    今天我们聊的是基于数据基因水平分库的存储架构方法,先看两个实际场景问题。分库订单场景一:订单实体查询,通过订单ID查询订单实体。读过如何生成分布式ID这篇文章的同学都知道在分布式服务中可以通过snowflake算法来生成全局唯一ID来作为订单ID,进行分库。那么直接通过订单ID就可以快速定位到库,高效的查出数据。分库..

    2025-05-03
  • 科技百科

    从0到1搭建数据仓库

    前言在互联网时代,数据就是财富,谁掌握了数据,谁就掌握了财富。数据对于企业来说:数据是企业的无形资产数据是企业创新的基石数据可有效辅助企业决策数据可有效提升企业生产力既然数据如此重要,一个合理的数据仓库架构又该如何设计呢?这篇文章,我们从数据仓库的四大层级以及各层级的用途来聊聊数据仓库的经典架构数据..

    2025-05-03
  • 科技百科

    数据结构是什么有什么用

    要想知道什么是数据结构?首先得知道数据是什么?数据是对客观事务的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号总称。那为何加上XX“结构”XX两字?数据元素是数据的基本单位,而任何问题中,数据元素都不是独立存在的,它们之间总是存在着某种关系,这种数据元素之间的关系我们称之为结构..

    2025-05-03
  • 科技百科

    大样本离群数据取舍的标准

    1、概述涉及到几个手段,分别是:1.14d检验法1.2Q检验法1.3Grubbs检验法1.4偏态-峰态数据分布正态性检验法1.5相对极差1.6STD、RSD说明:本文公式均为Excel公式,那种大计算公式懒得敲。对于以上6种手段,其中1-3为离群值的剔除,4也可以做离群值的剔除,详见GB/T 4883-2008偏度-峰度检验法,5-6为整体离散度的一个判断。2、..

    2025-05-03
  • 排行榜

    电饭煲排名前十名:品牌排行榜前十名实测数据供你参考

    【前言】在快节奏的现代生活中,电饭煲早已成为家家户户厨房的“刚需担当”。它不仅仅是一个简单的烹饪工具,更是现代饮食生活的重要缩影,体现了人们对于便捷、高效生活方式的追求。【行业乱象】然而,繁荣的市场背后却暗藏隐忧。随着行业竞争加剧,很多品牌为抢占份额,盲目追求低价与多功能噱头,导致市场上充斥着大量劣..

    2025-04-30

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制