数据结构 图论01 邻接矩阵、邻接表 代码
数据结构 图论02 十字链表详解 代码

阅读之前请了解先了解邻接表数据结构 图论01 邻接矩阵、邻接表 代码

数据结构

上面的数组+链表可以节约一些空间和方便增删,但是我们要计算一个顶点的度还是比较麻烦,十字链表就是解决计算顶点入度(就是有多少条边通向这个节点)的问题

顶点Vertex的结构

  • data :顶点具体数据信息
  • firstIn:通向这个顶点的(竖向)边链表的读一个节点
  • firstOut:通向其他顶点的(横向)边的链表的第一个节点

边edge的结构

  • fromVertex:箭头出发的顶点(比如A顶点)
  • toVertex:箭头指向的顶点(B顶点)
  • fromEdge:指向目标点是fromVertex的边,这里就是竖向链表的核心实现(绿色的2条边DA,CA)
  • toEdge:以fromVertex为基础,指向其他顶点的边(红色的2条边,AC,AB)
  • weight:权重

十字链表的结构

为了解决计算顶点入度的问题,在横向链表表示出度的基础上(红色的边),加上一个竖向链表表示入度(绿色的边),通过竖向链表可以轻松得到入度。

  • 红色箭头是横向表示出度,(同理于邻接链表)
  • 绿色箭头是竖向表示入度(竖向链表是十字链表的关键)

代码实现

Graph


import java.util.ArrayList;/*** 十字链表* @author Jarvan* @version 1.0* @create 2020/11/25 16:43*/
public class CrossLinkedListGraph<E> {class Vertex{E data;Edge firstIn;Edge firstOut;public Vertex(E data, Edge firstIn, Edge firstOut) {this.data = data;this.firstIn = firstIn;this.firstOut = firstOut;}}class Edge{int fromVertex;int toVertex;Edge fromEdge;Edge toEdge;int weight;public Edge(int fromVertex, int toVertex, Edge fromEdge, Edge toEdge, int weight) {this.fromVertex = fromVertex;this.toVertex = toVertex;this.fromEdge = fromEdge;this.toEdge = toEdge;this.weight = weight;}}private int numOfVertices;private int maxOfVertices;private ArrayList<Vertex> vertices;public CrossLinkedListGraph(int maxOfVertices) {this.maxOfVertices = maxOfVertices;this.vertices = new ArrayList<>(maxOfVertices);numOfVertices = 0;}public boolean putVertex(E data){if (numOfVertices < maxOfVertices){vertices.add(new Vertex(data,null,null));numOfVertices ++;return true;}return false;}public E getVertexData(int vertexIndex){if (vertexIndex<maxOfVertices){return vertices.get(vertexIndex).data;}return null;}/*** 插入边,横纵列表都要插入*/public boolean putEdge(int fromVertexIndex,int toVertexIndex,int weight){if (fromVertexIndex < maxOfVertices && toVertexIndex < maxOfVertices){Vertex fromVertex = vertices.get(fromVertexIndex);Edge newEdge = new Edge(fromVertexIndex,toVertexIndex,null,null,weight);//插入横向链表if (fromVertex.firstOut == null) {fromVertex.firstOut = newEdge;//插入竖向链表return insertFromEdgeLinkedList(fromVertex.firstOut);}//遍历元素然后将元素放到尾部Edge edge = fromVertex.firstOut;while (edge.toEdge != null) {edge = edge.toEdge;}edge.toEdge = newEdge;//插入竖向链表return insertFromEdgeLinkedList(edge.toEdge);}return false;}/*** 将插入竖向链表提升为一个方法*/private boolean insertFromEdgeLinkedList(Edge edge){if ( edge!=null){//获得新增加的指向的顶点Vertex toVertex = vertices.get(edge.toVertex);if (toVertex.firstIn==null){//如果指向的顶点没有竖向链表就直接将第一个边赋值给竖向链表toVertex.firstIn = edge;return true;}Edge fromEdge = toVertex.firstIn;while (fromEdge.fromEdge!=null){fromEdge = fromEdge.fromEdge;}fromEdge.fromEdge = edge;return true;}return  false;}public void print(){for (Vertex vertex : vertices) {Edge edge = vertex.firstOut;System.out.print(vertex.data+": ");while (edge!=null){System.out.print(vertices.get(edge.fromVertex).data+ " --> "+vertices.get(edge.toVertex).data+" weight="+edge.weight +"; ");edge = edge.toEdge ;}System.out.println();}}public void printVertexFromEdge(int fromVertex){System.out.println("====print vertex from edges====");Vertex vertex = vertices.get(fromVertex);Edge firstIn = vertex.firstIn;if (vertex.firstIn!=null){Edge fromEdge = vertex.firstIn;while (fromEdge!=null){//这里debug的时候录为nullSystem.out.println(vertices.get(fromEdge.fromVertex).data+" --> "+vertices.get(fromEdge.toVertex).data);fromEdge = fromEdge.fromEdge;}}else {System.out.println("null of firstIn");}}}

test

CrossLinkedListGraph<String> graph = new CrossLinkedListGraph<>(4);
graph.putVertex("A");
graph.putVertex("B");
graph.putVertex("C");
graph.putVertex("D");graph.putEdge(0,1,4);
graph.putEdge(0,2,3);
graph.putEdge(2,3,5);
graph.putEdge(2,0,5);
graph.putEdge(3,0,6);
graph.putEdge(3,1,6);
graph.print();
//获得一个点的fromEdge然后打印
graph.printVertexFromEdge(0);

result

A: A --> B weight=4; A --> C weight=3;
B:
C: C --> D weight=5; C --> A weight=5;
D: D --> A weight=6; D --> B weight=6;
====print vertex from edges====
C --> A
D --> AProcess finished with exit code 0

**

数据结构 优点 缺点
邻接矩阵 二维数组,实现简单,能同时求出顶点的出度和入度 稀疏图造成的空间浪费
邻接表 数组+链表,不会空间浪费 不能同时求出出度和入度;对边的操作需要2次
十字链表 横竖十字链表:可以同时求出出度和入度 对边的操作需要2次
邻接多重表 对边的操作减少到了一次 删除较为复杂

备注:这里的链表插入是遍历到链表尾部再插入,效率比较低下,建议使用”头插法“

数据结构 图论02 十字链表详解 代码相关推荐

  1. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  2. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  3. python链表值讲解_python数据结构之链表详解

    python数据结构之链表详解 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用 ...

  4. java数据结构-链表详解

    文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...

  5. 数据结构之链表详解(2)——双向链表

    目录 前言 一.双向链表 A.双向链表的含义 B.双向链表的实现 1.双向链表的结构 2.链表的初始化 初始化图解: 函数代码: 3.动态申请节点函数 函数代码: 4.打印双向链表函数 函数代码: 5 ...

  6. 数据结构与算法之时间复杂度详解

    数据结构与算法之时间复杂度详解 目录 排序算法的介绍和分类 算法的时间复杂度概念 常见的时间复杂度解析 平均时间复杂度和最坏时间复杂度 空间复杂度介绍 1. 排序算法的介绍和分类 排序算法的介绍 排序 ...

  7. 五分钟搞懂后缀数组!后缀数组解析以及应用(附详解代码)

    为什么学后缀数组 后缀数组是一个比较强大的处理字符串的算法,是有关字符串的基础算法,所以必须掌握. 学会后缀自动机(SAM)就不用学后缀数组(SA)了?不,虽然SAM看起来更为强大和全面,但是有些SA ...

  8. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

  9. 图论:最大流最小割详解

    最大流与最小割是十分重要且应用广泛的内容,本文用"水流"与"水管"类比,先讨论最大流问题,然后再说明最大流与最小割的特殊关系,我们还将讨论一些实际中会使用的相关 ...

  10. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)...

    导语 内容提要 殷人昆编著的<数据结构精讲与习题详解(C语言版第2版清华大学计算机系列教材)>是清华大学出版社出版的<数据结构(C语言版)>(第2版)的配套教材,对" ...

最新文章

  1. CPU 深夜狂飙,一帮大佬都傻眼了......
  2. 基于Gitolite的Git服务架设
  3. swift_030(Swift 的访问控制)
  4. 压缩base 64字符串_ftp下载多个文件,ftp下载多个文件打包成一个压缩包
  5. 汇编语言MOVZX和MOVSX指令
  6. 白山云科技 CTO 童剑:空降后,如何有技术又有艺术地破局?
  7. javascript 中面向对象实现 如何继承
  8. springMVC使用与生成序列号
  9. pcb成型板aoi检测_smt贴片加工打样的检测设备
  10. Python入门学习笔记(9)
  11. Master of GCD 线段树区间更新
  12. 航海王启航服务器维护要多久,《航海王启航》7月1日服务器更新维护公告
  13. 学计算机自考商务英语本科好吗,自考本科商务英语专业真的难吗
  14. 利用php利用root权限执行shell脚本必须进行以下几个步骤
  15. 破解百词斩单词数据之旅
  16. 【lidar】单目深度估计与伪雷达点云、可视化
  17. ppt怎么加注解文字_ppt幻灯片怎么给图片添加注释?
  18. 哪个一键重装电脑系统工具好用些?
  19. 试验数据管理系统TDM与SDM
  20. sklearn.neighbors 最近邻相关算法,最近邻分类和回归

热门文章

  1. 抖音检测注入框架分析
  2. tp6 实现汉字转拼音
  3. 中小学电教信息计算机管理员职责,中小学电教教师岗位职责
  4. access做仓库管理
  5. vue h5通过hbuilder打包为App的返回键兼容问题
  6. 【老生谈算法】matlab实现演化博弈算法源码——演化博弈
  7. windows下把SD卡格式化成NTFS格式
  8. plsql破解版,plsql安装包
  9. 薅羊毛!某东、某宝、某宁一次搞定~
  10. c语言外部中断服务程序设计,手把手教你学单片机的C语言程序设计十二中断服务函数.pdf...