数据结构-图存储表示之邻接表

邻接表

在图论中,邻接表代表一个图中的所有边或弧。

邻接表存储表示,需要保存一个顺序存储的顶点表和每个顶点上的边的链接表。

邻接表(Adjacency List),即数组与链表相结合的存储方法。

如果是无向图,那么每条边由两个结点组成,分别代表边的两个端点;

如果是有向图,那么每条边是一个结点对,分别代表边的始点和终点。

一般来说,邻接表是无向的。

在计算机科学中,邻接表描述一种紧密相关的数据结构,用于表征图。在邻接表的表示中,对于图中的每个顶点,我们将保存所有其它与之相连的顶点(即“邻接表”)。例如,由van Rossum提出的,使用 哈希表将每个顶点和该顶点的邻接点数组关连起来,就可以看作是上述表 示方法的一种实现。又如,在Cormenetal中,顶点数组的每个元素都指向一个邻接点单链表。

邻接表结构的困难之一是无法明确在什么地方保存相关边的长度或花销。为了解决这个问题,一些算法,如 Goodrich and Tamassia 所提出的面向对象邻接表,有时也称关联度,它为每个顶点保存一个对象表,每个对象表示指向顶点的那条边的关联度。为了完善这个结构,每条边必须指向两个组成其端点的顶点。这个额外的边对象使得它比直接列出所有边的邻接表消耗更多的内存,但它不失为一种保存边相关信息的好方法。

可用于替代邻接表的主要有邻接矩阵。用稀疏邻接矩阵表示邻接表时,将占用更少的空间。这是因为它能避免为不存在的边分配任何空间。除了空间方面的考虑外,不同的数据结构也使得不同的操作变得更容易。在一个邻接表中,给定一个顶点,我们能很容易地找出它的所有邻边,因为只需要读取它的邻接表就可以了。在一个邻接矩阵中,相同的操作则需要扫描一行,花费大约 O(n) 时间。而如果你想知道给定的两个顶点间是否存在有边,在邻接矩阵里可以立刻查到,在邻接表中则需要花费以边的最小关联度成比例的时间。

邻接表的处理方法是这样的。

1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。

若是有向图,邻接表的结构是类似的,以顶点作为弧尾来存储边表容易得到每个顶点的出度,而以顶点为弧头的表容易得到顶点的入度,即逆邻接表。

对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。

时间: 2024-11-02 20:19:41

数据结构-图存储表示之邻接表的相关文章

图 - 存储结构之邻接表

对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的.因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即数组与链表相结合的存储方法. 邻接表的处理方法是这样的. 1.图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 2.图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,

图的存储结构之邻接表

邻接矩阵的缺点:边数相对顶点较少的图,极大地浪费了存储空间. 把数组与链表相结合的存储方法称为邻接表.(Adjacency List) 邻接表的处理办法: 顶点用一个一维数组存储(较容易读取顶点信息),每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 每个顶点的所有邻接点构成一个线性表(用单链表存储).无向图称为顶点Vi的边表,有向图称为顶点Vi作为弧尾的出边表. 图1  无向图的邻接表结构 data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结

图的存储结构之邻接表(详解)

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M.对于稀疏图来说,M要远远小于N2.先上数据,如下. 1 2 3 4 5 6 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m.n表示顶点个数(顶点编号为1~n),m表示边的条数.接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z.下图就是一种使用链表来实现邻接表的方法. 上面这种实现方法为图中的每一个

图的深度优先遍历--邻接表实现

这里用邻接表实现图的深度优先遍历,采用递归实现. #include<iostream> using namespace std; #define VERTEXNUM 5//结点数 struct edgenode { int to; int weight; // 边的权值 edgenode *next; }; struct vnode { int from; edgenode *first; }; void createGraph(vnode *adjilist, int start, int

图的邻接矩阵与邻接表

一.如何创建邻接表和邻接矩阵? 如图,根据上图建立一个无向图的邻接矩阵和邻接表~ 输入的数据,第一行为两个整数n,e(0<n<=1000,0<e<=5000),表示有n个点和e条边,接下来的e行,每行包含2个整数,表示每条边所连接的两个点. 然后输出图.(无硬性要求) 输入数据: 5 81 01 21 32 32 43 43 04 0 输出数据(示例): 0->1->3->4->NULL1->0->2->3->NULL2->1-

数据结构之 图论---bfs(邻接表)

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

算法导论--图的存储(邻接表与邻接矩阵)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51888031 图的存储方法有邻接表.邻近矩阵.邻接多重表.十字链表等.本篇文章介绍两种简单且比较常用的两种方法:邻接表与邻接矩阵方法. 以下面的无向图为例,介绍两种存储方法.有向图的存储方法类似,只是边是单方向,无向图的边可以看做双向. 1.邻接链表法 邻接链表表示法对图中的每个顶点建立一个带头的边链表:第i条链表代表依附于顶点vi所有边信息,若为有向图,则表示

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另