首页 / 科技百科

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

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-

猜你喜欢

  • 机械之最

    机械结构设计有什么最经典的资料?

    很多小伙伴都知道机械结构工程师工资高,怎样才能迅速入门呢?或者怎样搞到一本“武林秘籍”,迅速进阶呢?今天向大家分享这样一个经典教材,内容包含了结构设计需要的壁厚设计、加强筋、螺丝、卡扣、超声波、止口、铰链、钣金等等,可以说囊括了结构设计需要的一切,学习后,一定后功力大增。资料第一页有相应地址,资料实..

    2025-06-21
  • 世界奇闻

    超级地球的定义、重要性及最新发现,探索宇宙奥秘的关键

    作为一名热衷天文研究的探索者,我对宇宙中的行星持有无尽的好奇与期望。近期科学界在距离地球约40光年内探测到了一颗名为“超级地球”的新星体,尽管它非已知的最小型系外行星,但其大气中首次探测到水蒸气含量,此发现对于研究适合人类居住的星球具有重要参考价值。“超级地球”的定义与重要性首先,需明确定义“超级地球..

    2025-06-20
  • 排行榜

    电饭煲实测排行榜前十名:核心数据测评教你怎么选才对

    在快节奏的时代下,智能电饭煲凭借多功能、一机多用等便捷功能,成为厨房标配。影响米饭蒸煮表现的主要因素有哪些?①加热方式:底盘和IH加热易衰减致夹生,螺旋焖压加热均匀,米饭香糯。②内胆形状厚度:球形内胆受热面积大、热对流好,平底或半釜较差。③温控精准度:精确控温避免夹生焦糊,让米饭达最佳口感。④腔体密闭..

    2025-06-19
  • 科技百科

    减速机结构及其各部件功能

    减速机是一种常见的机械传动装置,其作用是通过减小电动机高速旋转输出的转矩和转速,将之转变为适合特定工作要求的转矩和转速。在工业生产中,减速机广泛应用于各种机械设备中,以满足不同的工作需要。本文将介绍减速机的原理和应用。一、减速机的原理减速机通过采用齿轮传动的原理来实现减速效果。它主要由输入轴(电动机..

    2025-06-12
  • 科技百科

    网站结构主要分为哪些

    我们在向专业建站公司咨询搭建网站的时候,往往会被问想要搭建什么类型的网站这样的问题,那么网站到底分为几种类型呢?下面就由迈为小编跟大家分享一下常见的网站类型有哪几种。网站类型① 展示型企业官网展示型企业网站的主要作用就是以展示公司企业形象、产品服务为主,里面涵盖的内容包括像企业简介、企业产品、服务、..

    2025-06-12
  • 最新重庆人口数据大分析,震惊,重庆市人满到爆!

    我国地大物博,不仅面积广大,而且人口也不少。在我国,有着许多的省份,当然也有着直辖市,而重庆就是其中一个。近年来,重庆一直是一个引人热议的一个市,重庆人口也一直在增加。随着重庆的日益发达,重庆人口也是只增不减。1、最新重庆人口数量分析目前,3016.55万人是重庆市的常住人口,25.15万人是比上年增加的人数,0..

    2025-06-09
  • 红皇后假说解释遗传结构的进化 描绘生存竞争的激烈规则

    红皇后假说的意思主要就是说生物在自然界必须要不断的进化,比别的生物进化的更快,不然就会被淘汰。举个简单的例子就像一头狮子追麋鹿群,麋鹿想要生存不需要跑的最快,只要不落到最后一名就可以存活。红皇后假说的来源,物种之间存在动态平衡1、描绘自然界生存法则在英国作家路易斯卡洛尔的《爱丽丝镜中奇遇记》中,红皇..

    2025-06-07
  • 最经典名曲萨克斯《回家》 悠扬间明了家的定义

    提到萨克斯名曲,萨克斯《回家》一定是最经典的一首。当年萨克斯并不让世人熟知,这一首曲子,悠扬而又哀伤,让萨克斯这种乐器登上舞台。萨克斯回家一曲,曲如其名,让人一听就会有一种思乡的情怀涌入心头。这样的曲子背后又有着怎样动人的故事呢?回家一曲又让我们读懂了什么呢?乐曲简介萨克斯回家这首乐曲作者为美国著名..

    2025-06-05

微信分享

微信分享二维码

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

链接已复制