十字链表

什么是图?

拥有回忆 提交于 2020-03-12 06:28:16
什么是图呢? 直观的理解图的美貌 图的基本术语 如何去表示图呢? 声明 :本次写的文章属于系列文章,主要介绍数据结构中的图的使用、应用场景、以及算法实现。本系列文章会围绕下面的结构来写,本篇文章首先介绍《什么是图?》《如何去表述图?》。 什么是图呢?学习过数据结构的童鞋肯定早有耳闻,但是多数又是望而却步。通常大家都会惧怕自己不清楚的知识,直觉的会感觉这个不会的东西会特别复杂,同样,我也不例外。这个时候,谁能抵制住这个直觉,就会先人一步啦。呀呀,怎么开始抒情了,注意…正片开始!!! 直观的理解图的美貌 每个人城里人都有微信, 像我这种村里的可能没有 ,闭上眼试想,你的好友 列表里有你的虎妈、严爸、女朋友,你的女朋友的好友列表里有你妈、你爸、你和老王。这样的关系,用线连接在一起,就构成了 多对多的朋友关系网 ,这个关系网就是数据结构当中的 图(Graph) 。 再比如你去坐地铁, 村里人也是坐不上地铁的 ,买卡的时候,你会看到显示器上犬牙交错的地铁线路,这样的交通网络,也是数据结构中的图。 图的基本术语 什么是顶点和边呢 ?官方说法:在图中,最基本的单元是 顶点(vertex) ,相当于树中的节点。顶点之间的关联关系,被称为 边(edge) 。如果不理解,你可以这样想,你、你女朋友,还有老王,都作为关系网中的顶点,你女朋友和老王的关系,可以看做边。 什么是带权图、无权图

十字链表的画法

别来无恙 提交于 2020-03-11 18:57:37
十字链表的画法 基本概念 十字链表(Orthogonal List) 是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。 入弧和出弧:入弧表示图中发出箭头的顶点,出弧表示箭头指向的顶点。 弧头和弧尾: 弧尾 表示图中发出箭头的顶点, 弧头 表示箭头指向的顶点。 同弧头和同弧尾:同弧头,弧头相同弧尾不同;同弧尾,弧头不同互为相同。 我研究得出画十字链表的方法 还是以课上老师给出的有向图为例 第一步,列出图的所有顶点,并进行编号。画五行含三个方格的横格,每一排最左边那格分别填写各顶点,入弧和出弧的暂时不管。 第二步,画出各行对应的顶点表示出弧的所有关系——即右半部分的那些含四个方格的横格。画的时候为了方便之后的连线,建议可以将弧尾相同的画在同一行,将弧头相同的画同一列。填写弧尾与弧头,同弧头和同弧尾先暂时不管。 第三步,连线。 将表示顶点的三格图中入弧指向对应列所有的四格方格。例如a的编号为0,则a的入弧指向第一列弧头为0的四格方格。 四格方格中,同弧头指向本列,同弧尾指向本行。 若出弧或同弧尾右边没有方格,则为空。 来源: https://www.cnblogs.com/zyl905487045/p/7815429.html

图的存储结构

你说的曾经没有我的故事 提交于 2020-01-10 00:34:35
图的存储结构 这里我们只要介绍五种存储结构的理论和特点以及邻接矩阵,邻接表,边集数组的c语言表示,十字链表和邻接多重表是图的遍历可视化系统要用的存储结构在下一节我们将针对这两中数据结构进行详细讲解包括这两种结构对于图的各种操作(用java描述) 图的存储结构相对于线性表和树来说相对要复杂得多,我们所说的“顶点的位置”或“邻接点的位置“只是一个相对的概念。从图的逻辑定义结构来看,图上任何一个顶点都可以被看成是第一个顶点,任一顶点的邻接点之间不存在次序关系,比如如下四张图: 其实他们是同一个图 正是由于图的复杂性,任意两个顶点之间存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系,也就是说,图不可能用简单的顺序结构来表示。而多重链表的方式,即一个数据域和多个指针组成的结点表示图中的一个顶点,尽管这样可以实现图结构,但这样做是有问题的。如果各个顶点之间的度相差很大,按度最大的顶点设计结点结构会造成很多存储单元的浪费,而若按每个顶点自己的度数设计顶点结构,在操作上也会带来很多不便。所以为了解决此难题,前辈们提出了五种存储结构 1.邻接矩阵 定义:图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或者弧的信息 对于一个无权图来说: 设图有G个顶点,则邻接矩阵是一个n*n的方阵

(转载)漫画:为什么你需要了解数据结构中的图?

◇◆丶佛笑我妖孽 提交于 2019-12-12 09:52:54
原文地址: https://blog.csdn.net/csdnnews/article/details/88809812 图的概念 究竟什么是图呢?大家先来想一想咱们常用的互联网产品。 举个栗子,大家一定都用过微信,假设你的微信朋友圈中有若干好友:张三、李四、王五、赵六、七大姑、八大姨。 而你七大姑的微信号里,又有若干好友:你、八大姨、Jack、Rose。 微信中,许许多多的用户组成了一个多对多的朋友关系网,这个关系网就是数据结构当中的 图(Graph) 。 再举一个栗子,咱们在用百度地图的时候,常常会使用导航功能。比如你在地铁站A附近,你想去的地点在地铁站F附近,那么导航会告诉你一个最佳的地铁线路换乘方案。 这许许多多地铁站所组成的交通网络,也可以认为是数据结构当中的图。 图,是一种比树更为复杂的数据结构。树的节点之间是 一对多 的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是 多对多 的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。 图的术语 下面我们来介绍一下图的基本术语: 在图中,最基本的单元是 顶点(vertex) ,相当于树中的节点。顶点之间的关联关系,被称为 边(edge) 。 在有些图中,每一条边并不是完全等同的。比如刚才地铁线路的例子,从A站到B站的距离是3公里,从B站到C站的距离是5公里......这样就引入一个新概念:边的 权重

十字链表完成稀疏矩阵相加

谁说我不能喝 提交于 2019-12-06 11:43:54
#include <iostream> #include <malloc.h> #include <stdio.h> using namespace std; typedef struct OLNode { int i,j; int e; struct OLNode *right,*down; }OLNode,*OLink; typedef struct { OLink *rhead,*chead; int mu,nu,tu; }CrossList; int CreateSMatrix_OL(CrossList &M) { int i,j,k,e; OLink p,q,q1; cout<<"请分别输入该矩阵的行数,列数,所含非零元的个数:"<<endl; cin>>M.mu>>M.nu>>M.tu; if(!M.mu||!M.nu||!M.tu||M.mu*M.mu<M.tu) return 0; M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLink));//默认从第一行和第一列开始 if(!M.rhead) return 0; M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLink)); if(!M.chead) return 0; for(k=1;k<=M.mu;k++) M.rhead[k]=NULL;

数据结构(二十八)图的五种存储结构

匿名 (未验证) 提交于 2019-12-03 00:39:02
  由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系,也就是说,图不可能用简单的顺序存储结构来表示。   多重链表的方式,即以一个数据域和多个指针域组成的结点表示图中的一个结点,尽管可以实现图结构,但是如果各个顶点的度数相差很大,按度数最大的顶点设计结点结构会造成很多存储单元的浪费,而若按每个顶点自己的度数设计不同的结点结构,又带来操作的不变。   图的类型主要有4种:无向图、有向图、无向网和有向网。   图的五种常见的存储结构:领接矩阵、领接表、十字链表、领接多重表和边集数组。   一、领接矩阵    图的领接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一位数组存储图中顶点信息,一个二维数组(称为领接矩阵)存储图中的边或弧的信息。    1.举例 无向图    有向图    带权值的网图      二、邻接表   对于边数相对顶点较少的图,领接矩阵存在对存储空间的极大浪费的。可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。   领接表是由两部分组成。顶点用一个一维数组存储。而每个顶点的所有领接点构成一个线性表,由于领接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表。    对于有n个顶点和e条边的无向图

采用十字链表存储的稀疏矩阵

只愿长相守 提交于 2019-12-01 07:30:56
Description 当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储的结构来表示三元组的线性表了。因此,在这种情况下,采用链式存储结构表示三元组更为恰当。十字链表就是能够实现这样功能的一种数据结构。 在十字链表中,每个非零元可以用一个包含5个域的结点表示。其中i、j和e这3个域分别表示该非零元所在的行、列和非零元的值,向右域right用来链接同一行中下一个非零元,而向下域down用来链接同一列中下一个非零元。同一行的非零元通过right域链接成一个线性链表,同一列的非零元通过down域链接成一个线性链表。每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵通过这样的结构形成了一个十字交叉的链表。 稀疏矩阵的十字链表类型可以描述如下: 下面是建立稀疏矩阵十字链表的算法描述: 给出一个稀疏矩阵,请将其存储到一个十字链表中,并将存储完毕的矩阵输出。 Input 输入的第一行是两个整数r和c(r<200, c<200, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示稀疏矩阵的各个元素。 Output 输出读入的矩阵。输出共有r行,每行有c个整数,每个整数后输出一个空格。请注意行尾输出换行。 Sample Input 5 6 0 18 0 0 0 0 0 0 67 0 0 0

【数据结构】图

让人想犯罪 __ 提交于 2019-11-29 23:28:35
图 图结构可以分为有向图和无向图,常见地表示方法有数组表示法、邻接表、十字链表和邻接多重表,遍历地方式有两种,一种是深度优先遍历,另一种是广度优先比遍历。 1.1 什么是图 每个数据元素称为 顶点 ,在有向图中,从V1到V3称为一条 弧 ,V3到V1是另一条弧,V1称为弧尾,V3称为弧头。在无向图中,从V 1到V3称为一条 边 。 有n个顶点, 1/2n(n-1) 条边地无向图称为 完全图 ,有 n(n-1) 条弧地有向图称为 有向完全图 ,有很少条边或图称为 稀疏图 ,反之称为 稠密图 。 在G2无向图中,类似V3与V1、V2和V4之间有边的互称为 邻接点 , 与顶点相关联的边数 称为顶点的 度 。 在G1有向图中,顶点的度是 顶点的出度和入度之和 ,以顶点为头的弧的数目称为 入度 ,为尾的弧的数目称为 出度 。 从一个顶点到另一个顶点的顶点序列称为 路径 ,在有向图中,路径是有方向的,路径上边或弧的数目称为 路径的长度 ,如果一条路径中的起始顶点和结束顶点相同,那么称这个路径为 环 或者 回路 ,不出现重复顶点的路径称为 简单路径 。 无向图中,如果一个顶点到另一个顶点有路径,那么它们就是 连通 的,如果图中的任意两个顶点都是连通的,那么这个图就是 连通图 。无向图中的 极大连通子图 称为 连通分量 。 如果是有向图中的任意一对顶点都有路径,那么这个就是 强连通图 ,相应的它的