[数据结构]图,邻接多重表,十字链表

  十字链表

  你会发现,要表示一个有向图,因为有 出度 和 入度 ,需要两个邻接表:邻接表和逆邻接表。

  其实我们可以把这两个表整合在一起,也就是十字链表(Orthogonal List)。

  我们依然需要构造一种结构体A,用结构体A的数组来存放所有顶点-我们其实可以把它叫做 顶点表。

  我们构造的结构体A如下:

data firstin firstout

  构造结构体B,用结构体B来记录与这个顶点 用边邻接的 顶点的相关信息,我们把它叫做 边表

tailvex headvex headlink taillink

  在顶点表的每个顶点中,我们用firstin去指向和这个顶点有关的入边表的第一个元素(指向这个顶点的边,叫做入边),叫做入边表头指针

  用firstout去指向和这个顶点有关的出边表的第一个元素(从这个顶点指向别的顶点的边,叫做出边),叫做出边表头指针

  data用于存放这个顶点的数据。

  在边表的每个元素中,tailvex是弧的起点在顶点表的数组下标,headvex是弧终点在顶点表的数组下标。headlink(入边表指针域)指向边表中和这个元素的弧终点相同的下一个元素,taillink(出边表指针域)指向边表中和这个元素的弧起点相同的下一个元素。

  如果是网(每个边都带有权值的图),还可以增加一个weight域来存储权值。

  举一个具体的例子如下图:

图-十字链表示例

  V0,V1,V2,V3四个顶点,对应的数组中的下标分别为0,1,2,3。我们也可以看出,五条边分别为 0-3,1-0,1-2,2-1,2-0(需要考虑方向)。在构造边表时,你会注意到,对于边表中的一个元素,它作为某个顶点的出边时,也一定是对应的另一个顶点的入边。

  邻接多重表

  十字链表主要用于有向图。对于无向图,当我们对这个图的使用侧重于边的处理时,邻接多重表是一个更好的选择。

  我们新建边表所使用的结构体B 如下:

ivex ilink jvex jlink

  其中ivex,jvex是这条边所连接的两个顶点在顶点数组中的下标。ilink指向 ivex的另一条边,jlink指向 jvex的另一条边。 或者更机械化的说法,ilink指向的下一个元素的jvex与当前元素的ivex相同。jlink指向的下一个元素的ivex与当前元素的jvex相同。

图-邻接多重表的示例

  V0,V1,V2,V3四个顶点,对应的数组中的下标分别为0,1,2,3。我们也可以看出,五条边分别为 0-1,0-2,1-2,2-3,3-0(没有方向的区别)。

  边集数组

  还有一种表达方式,边集数组。

  

图-边集数组的示例

  这种表示方法从结果的展示上来看非常直观容易理解。但是要找到对应的顶点所有的边,他需要对数组进行遍历。所以这种方法,似乎更适合需要对边进行逐一操作的场合。

未完。

原文地址:https://www.cnblogs.com/OranBlog/p/8427168.html

时间: 2024-10-12 17:30:20

[数据结构]图,邻接多重表,十字链表的相关文章

7-4-无向图的邻接多重表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 无向图的邻接多重表存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.LinkQueue.c      

看数据结构写代码(38) 图的邻接多重表表示法与实现

图的邻接多重表 是 无向图的 另一种表示法.其与 邻接表 的差别 仅仅 在于 ,邻接表 用 两个 顶点 来表示 一条边,而 邻接多重表 用一个 顶点来表示一条边.这样使得 邻接多重表 在 某些操作 要 来的 方便.例如 将 搜索过的边 做记号 或者 删除 一条边. 下面是邻接多重表的结构: 下面的 6条边 用 6个弧 节点表示,用12个指针指向,每个弧节点被 指向2次.这样使得我们 在 释放内存的时候 需要格外小心. 下面上代码: 源码工程文件网盘地址:点击打开链接 // AMLGraph.cp

图的邻接多重表

问题引出:无向图中,例如A0-A1这条边,如红色框所示,其实他们说明的是同一个信息,但是开了两个空间就浪费了 于是考虑用一个方向来明确出一条边,邻接多重表是无向图的另一种链式存储结构,它与十字链表非常类似 例如:从A0出发有边0-1,边3-0,边0-2 ,注意空所放的位置,是对应节点的后面如图中红色框所示,0-1边中的黑色空只能放在1后面不能放在0后面,因为它代表的是从1出来的边 原文地址:https://www.cnblogs.com/Liu269393/p/10226022.html

图的邻接多重表和搜索(C++版本)

最近在学数据结构,学到图这一章,网上的C++版本的代码乱得不行,所以自己写了一个完整C++版本的放这里. 用邻接多重表表示一个无向图,并给出DFS和BFS搜索代码.邻接多重表好处就是贼直观,几条边就几个边表的元素. 代码如下: 边表节点定义(其实就是边的定义) typedef struct EdgeNode //邻接多重表 { int iVertex; EdgeNode* iLink; int jVertex; EdgeNode* jLink; }; 顶点表节点的定义 template <typ

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

数据结构----图(邻接表用法)

1.定义图的结构: 1 #define NUM_MAX 6 2 typedef struct ArcNode{ 3 int adjvex; 4 struct ArcNode * nextArc; 5 }ArcNode; //定义弧结点结构体 6 typedef struct VertexNode{ 7 int data; 8 ArcNode * firstArc; 9 }VertexNode;//定义顶点结构体 10 typedef struct { 11 VertexNode * AdjLis

3、蛤蟆的数据结构笔记之三线性表单项链表实现

今天励志短语:"人生的价值,即以其人对于当代所做的工作为尺度." 昨天我们看了线性表的一些定义概念,今天来看下其中的单项链表代码如何实现. 1.  声明结构 如下声明一个指向结构的指针.(存放整数的节点,我们也可以根据需要创建字符的链表) typedef struct list_node *list_pointer; typedef struct list_node{ intdata; list_pointerlink; }; list_pointerptr = NULL; 2.  定

数据结构 栈(顺序表和链表实现) 回顾练习

1 #!/usr/bin/env python3 2 3 class StackUnderflow(ValueError): 4 pass 5 6 class Node(object): 7 def __init__(self, elem, next_=None): 8 self.elem = elem 9 self.next = next_ 10 11 class LStack(object): 12 def __init__(self): 13 self._elems = [] 14 15