首页 / 科技百科

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

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-

猜你喜欢

  • 世界最大

    这一劳动力市场,印度世界最大!80%“数据工人”来自村镇

    人工智能(AI)产业的高速发展催生出一个重要职业——AI数据标注。它通过为机器学习的原始数据(如图片、视频等)打上标签,让计算机不断识别这些数据的特征,从而实现自主识别。这是2023年2月15日在美国旧金山拍摄的waymo公司无人驾驶出租车 新华社/美联AI数据标注职业产生之初,标注员们往往能获得相对丰厚的薪酬,且部分..

    2025-08-05
  • 科技百科

    古代机械摆钟的结构

    时钟的历史源远流长,种类也要比手表丰富的多,从不同的角度,比如按照技术功能、材料、产地、摆放方式、款式等,有着不同的分类方式。在这里,我们从最直观的角度将现代时钟笼统地分为五大类别。航海钟(Navigation Clock)航海钟又称航海天文钟或船钟,是专为航海计时以及测量海上经度发明的计时仪器。最早的航海钟诞生于..

    2025-08-03
  • 世界最长

    世界上最大的船能有多大?数据对比航母后才发现,航母就是小儿科

    #头号创作者激励计划#在很多人的印象里,航母是一艘庞然大物了。不过在大型船舶制造领域,航母的体型其实只能算小儿科。世界上最大的航母也就11万吨左右,但在民船领域排水量超过20万吨的船比比皆是。目前世界上最大的航母——福特级人类历史上最大的船人类历史上造过的最大的船,是诺克・耐维斯号(Knock Nevis)。诺克・..

    2025-07-29
  • 百科大全

    坦克世界金币车t27入手咋样(坦克世界7号坦克银币车和7201K金币车数据对照

    哈喽大家好,我是游戏小编绿尘君,今天为大家带来车和7201K金币车数据对比,向你完美诠释什么叫同车不同命!坦克世界原四件套的加强在新版本公测服实装,风头几乎被意大利炮完全掩盖,稍微看了一下tanks.gg,对基础参数和一点不容易留意的参数进行比较,尤其是装甲,非常灵异。以下7号坦克指银币车和7201K指金币车对比,数..

    2025-07-24
  • 机械之最

    拆解机械的 “骨骼与肌肉”:聊聊机械类专业的狭义定义

    当我们谈论 “机械类专业” 时,很多人会联想到工厂里轰鸣的机床、汽车的发动机,甚至是机器人的精密动作。但在专业领域中,机械类专业存在 “广义” 与 “狭义” 之分。广义的机械类专业常常涵盖机械设计、电子控制、自动化等跨学科内容,而狭义的机械类专业则像一位专注于 “骨骼与肌肉” 的工程师,将目光牢牢锁定在机械..

    2025-07-20
  • 排行榜

    电饭煲哪个牌子的好?质量排名前十名真实测评数据公开!

    现在市面上的电饭锅(又名电饭煲)品牌琳琅满目,从传统品牌到新兴网红大牌应有尽有,让消费者眼花缭乱,难以抉择。若购买劣质电饭锅,可能会遇到安全隐患、异味问题甚至有毒有害物质的泄露等问题,这些都严重影响消费者的健康。而且性能也不行,煮出来的米饭口感很不好拿电饭煲哪个牌子的好?这个问题可能是每个家庭在选购..

    2025-07-09
  • 世界最高

    全球最大具身智能数据工厂落地天津

    中新社天津6月23日电 (记者 周亚强 王君妍)全球规模最大的具身智能数据工厂——帕西尼具身智能超级数据工厂(Super EID Factory)23日在天津空天数字产业园正式启用。该工厂旨在破解行业数据瓶颈,为全球具身智能产业提供核心驱动力。6月23日,全球规模最大的具身智能数据工厂——帕西尼具身智能超级数据工厂(Super EID Facto..

    2025-06-28
  • 探索百科

    等边三角形的定义

    等边三角形的定义和特征。本书可作为高等院校数学专业本科生、研究生教材,也可作为相关领域工程技术人员的参考用书。同时,本书还可作为大专院校计可作为高等院校数学专业本科生、研究生教材,也可作为相关领域工程技术人员的参考用书。本文目录一览:1、2、3、4、5、6、什么是等边三角形?什么是等腰三角形?两条边相等的..

    2025-06-27

微信分享

微信分享二维码

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

链接已复制