十字链表简介与实现(Java)

article/2025/9/15 14:48:11

十字链表简介与实现(Java)

  • 结构
  • 实现

结构

十字链表存储有向图(网)的方式与邻接表有一些相同,都以图(网)中各顶点为首元节点建立多条链表,同时为了便于管理,还将所有链表的首元节点存储到同一数组(或链表)中。

其中,建立个各个链表中用于存储顶点的首元节点结构如图 1 所示:

十字链表中首元节点结构示意图
图1

从图 1 可以看出,首元节点中有一个数据域和两个指针域(分别用 firstin 和 firstout 表示):
firstin 指针用于连接以当前顶点为弧头的其他顶点构成的链表;
firstout 指针用于连接以当前顶点为弧尾的其他顶点构成的链表;
data 用于存储该顶点中的数据;
由此可以看出,十字链表实质上就是为每个顶点建立两个链表,分别存储以该顶点为弧头的所有顶点和以该顶点为弧尾的所有顶点。

注意,存储图的十字链表中,各链表中首元节点与其他节点的结构并不相同,图 1 所示仅是十字链表中首元节点的结构,链表中其他普通节点的结构如图 2 所示:

十字链表中普通节点的结构示意图
图2

从图 2 中可以看出,十字链表中普通节点的存储分为 5 部分内容,它们各自的作用是:
tailvex 用于存储以首元节点为弧尾的顶点位于数组中的位置下标;
headvex 用于存储以首元节点为弧头的顶点位于数组中的位置下标;
hlink 指针:用于链接下一个存储以首元节点为弧头的顶点的节点;
tlink 指针:用于链接下一个存储以首元节点为弧尾的顶点的节点;
info 指针:用于存储与该顶点相关的信息,例如量顶点之间的权值;

比如说,用十字链表存储图 3a) 中的有向图,存储状态如图 3b) 所示:

十字链表存储有向图示意图
图 3

拿图 3 中的顶点 V1 来说,通过构建好的十字链表得知,以该顶点为弧头的顶点只有存储在数组中第 3 位置的 V4(因此该顶点的入度为 1),而以该顶点为弧尾的顶点有两个,分别为存储数组第 1 位置的 V2 和第 2 位置的 V3(因此该顶点的出度为 2)。

对于图 3 各个链表中节点来说,由于表示的都是该顶点的出度或者入度,因此没有先后次序之分。

实现

package test;
public class OListDG {int vlen; // 顶点个数int elen; // 边个数VertexNode[] vertexNodeList; // 顶点数组EdgeNode edgeNode;/*** 构造函数* @param vexs* @param edges*/public OListDG(char[] vexs, char[][] edges) {vlen = vexs.length;elen = edges.length;// 初始化顶点,建立顶点表vertexNodeList = new VertexNode[vlen];for (int i = 0; i < vlen; i++) {vertexNodeList[i] = new VertexNode();vertexNodeList[i].vertex = vexs[i];vertexNodeList[i].firstIn = null;vertexNodeList[i].firstOut = null;}// 初始化边,利用头插法建立十字链表for (int i = 0; i < elen; i++) {EdgeNode edgeNode_1 = new EdgeNode();EdgeNode edgeNode_2 = new EdgeNode();int vi = getPosition(edges[i][0], vexs);int vj = getPosition(edges[i][1], vexs);edgeNode_1.tailvex = vi;edgeNode_1.headvex = vj;edgeNode_1.taillink = vertexNodeList[vi].firstOut;vertexNodeList[vi].firstOut = edgeNode_1;edgeNode_2.tailvex = vi;edgeNode_2.headvex = vj;edgeNode_2.headlink = vertexNodeList[vj].firstIn;vertexNodeList[vj].firstIn = edgeNode_2;}}/***  功能:顶点表结点结构*  参数:vertex --> 顶点域,存储顶点信息*       firstIn --> 入边表头指针,指向该顶点的入边表中第一个结点*       firstOut --> 出边表头指针,指向该顶点的出边表中第一个结点*/private class VertexNode {char vertex; EdgeNode firstIn;EdgeNode firstOut; }/***  功能:边表结点*  参数:tailvex --> 弧起点在顶点表的下标*        headvex --> 弧终点在顶点表的下标*        headlink --> 入边表指针域,指向终点相同的下一条边*        taillink --> 边表指针域,指向起点相同的下一条边*/private class EdgeNode {int tailvex;int headvex;EdgeNode headlink;EdgeNode taillink;}/***  功能:返回ch位置*/private int getPosition(char ch, char[] vexs) {for (int i = 0; i < vlen; i++)if (vexs[i] == ch)return i;return -1;}/***  功能:打印邻接表和逆邻接表*/public void print() {System.out.printf("AdjList:\n");for (int i = 0; i < vlen; i++) {System.out.print(vertexNodeList[i].vertex + "-->");if (vertexNodeList[i].firstOut != null) {EdgeNode mEdgeNode = new EdgeNode();mEdgeNode = vertexNodeList[i].firstOut;System.out.print(mEdgeNode.headvex);while (mEdgeNode.taillink != null) {mEdgeNode = mEdgeNode.taillink;System.out.print(mEdgeNode.headvex);}System.out.print("\n");} else {System.out.print("\n");}}System.out.print("----------\n");System.out.printf("InvAdjList:\n");for (int i = 0; i < vlen; i++) {System.out.print(vertexNodeList[i].vertex + "<--");if (vertexNodeList[i].firstIn != null) {EdgeNode mEdgeNode = new EdgeNode();mEdgeNode = vertexNodeList[i].firstIn;System.out.print(mEdgeNode.tailvex);while (mEdgeNode.headlink != null) {mEdgeNode = mEdgeNode.headlink;System.out.print(mEdgeNode.tailvex);}System.out.print("\n");} else {System.out.print("\n");}}}/*** 主函数*/public static void main(String args[]) {// 顶点数组char[] vexs = {'A', 'B', 'C', 'D'};// 边数组char[][] edges = new char[][] {{'A', 'B'}, {'A', 'C'}, {'A', 'D'}, {'B', 'D'}, {'C', 'D'}};OListDG listUDG = new OListDG(vexs, edges);listUDG.print();}
}

http://chatgpt.dhexx.cn/article/6EnJllQN.shtml

相关文章

Java输出一个*号十字架

总共9行 每一行4个空格除了第五行不要空格 每一行1个*除了第五行需要9个* 利用for的循环嵌套方法&#xff0c;用三个for 从上往下 第一个for代表行数&#xff0c;第二个for代表空格数&#xff0c;第三个for代表输出的*数 做法如下:

Java 写一个简单的"十字"

如何用代码写出十字&#xff1f; 首先创建一个新的Package&#xff0c;如图&#xff1a; 取一个com.➕名字缩写和日期&#xff0c;下一行写public class 类名&#xff0c;后面加上一个{ },在它的中间写上public static void main&#xff08;String[] args){, 如图&#xff1a…

JTextField的部分常用使用方法

本篇文章将会教会大家如何使用JTextField输入框 1.创建JTextField和添加 //创建输入框 JTextField jTextField new JTextField(); //将标签添加到面板里 jPanel.add(jTextField);2设置JTextField大小坐标 //设置输入框大小 jTextField.setSize(300,100); //设置输入框坐标…

Exists 用法解释

exists的实例解析 现有两个表 a&#xff1a; b: 现有sql语句如下 select * from a where exists (select 1 from b where b.b_id a.id); 执行结果如下&#xff1a; 含义解析&#xff1a;exists 的意思是用于检查子查询是否至少会返回一行数据&#xff0c;该子查询实际上并不…

MySQL中的EXISTS用法

EXISTS 语法&#xff1a; SELECT 字段 FROM table WHERE EXISTS (subquery); 参数&#xff1a; subquery是一个受限的SELECT语句&#xff08;不允许有COMPUTE子句和INTO关键字&#xff09; 示例&#xff1a; SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.id …

EXISTS用法

EXISTS用于检查子查询是否至少会返回一行数据&#xff0c;该子查询实际上并不返回任何数据&#xff0c;而是返回值True或False 方法/ 1 EXISTS用于检查子查询是否至少会返回一行数据&#xff0c;该子查询实际上并不返回任何数据&#xff0c;而是返回值True或False EXISTS 指定一…

hivesql中 exists 用法

有一次面试的时候&#xff0c;面试官问了这么一个场景题&#xff1a;一家门店一个月内每位顾客访问的目的可能有多种&#xff0c;并给到访顾客的目的打标签1、2、3、4这四类&#xff0c;现在要统计这家门店一个月内没有3、4标签的顾客明细。&#xff08;也就是顾客到访标签只有…

mysql中not exists用法_not exists用法

not exists是sql中的一个语法,常用在子查询和主查询之间,用于条件判断,根据一个条件返回一个布尔值,从而来确定下一步操作如何进行,not exists也是exists或in的对立面。 not exists 是exists的对立面,所以要了解not exists的用法,我们首先了解下exists、in的区别和特点:…

Hive exists 用法

where exists(select c2/1/*/key2 from tb2 where tb2.key2 = tb1.key1) exists()中的select后面跟其他字段也行,where后面用关联字段即可! selec * : in :

SQL中EXISTS的用法

比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和Compan…

在Android手机上使用MACE实现图像分类

前言 在之前笔者有介绍过《在Android设备上使用PaddleMobile实现图像分类》&#xff0c;使用的框架是百度开源的PaddleMobile。在本章中&#xff0c;笔者将会介绍使用小米的开源手机深度学习框架MACE来实现在Android手机实现图像分类。 MACE的GitHub地址&#xff1a;https://…

Ubuntu 16.04 下编译小米mace源码依赖库,跑在android板子上

https://blog.csdn.net/qq_27063119/article/details/81015227 以上链接是编译mace源码的基础步骤&#xff0c;下面我叙述一下本人编译所踩过的坑 1、编译过程中所需要的依赖必须全部安装&#xff0c;就算你一开始并没有用到的依赖&#xff0c;到后面还是会用到&#xff0c;还…

比拼三大移动端深度学习框架,小米MACE有哪些优势?

采访嘉宾 | 何亮亮 AI前线导读&#xff1a; 随着深度学习领域的快速发展&#xff0c;以及移动端芯片计算能力的逐步提升&#xff0c;设备端上的深度学习推理正在变成一个巨大的需求和趋势&#xff0c;一个好用的深度学习框架成为深度学习应用落地的关键。小米团队打造的MACE (…

小米开源框架mace android案例调试

小米开源框架mace android案例调试 1. 准备工作 编译环境准备&#xff1a;请参照小米官方的文档&#xff1a; https://mace.readthedocs.io/en/latest/installation/env_requirement.html Required dependencies SoftwareInstallation commandTested versionPython 2.7Bazelba…

MACE的环境搭建——conda实现

1. MACE 主页 MACE 的github地址&#xff1a;https://github.com/XiaoMi/mace 小米官方的相关文档&#xff1a;https://mace.readthedocs.io/en/latest/ 对开发环境的要求&#xff0c;可以按照以下指令安装相关的包&#xff1a; 2. 创建虚拟环境并安装常见的包 (1) 创建虚拟环境…

小米开源自研移动端深度学习框架MACE

小米人工智能与云平台副总裁崔宝秋博士在开源中国开源世界高峰论坛上发表《小米 AI 时代的开源》演讲&#xff0c;并在会上宣布&#xff0c;开源小米自研的移动端深度学习框架 Mobile AI Compute Engine (MACE)。 6 月 28 日&#xff0c;小米人工智能与云平台副总裁崔宝秋博士在…

小米开源框架MACE 源码阅读笔记

转载自 https://www.jianshu.com/p/7061fd67d419 前扯 在前不久的某高峰论坛上&#xff0c;小米开源了其移动端的深度学习框架Mobile AI Compute Engine&#xff08;MACE&#xff09;。这对于很多致力于嵌入式端优化的人来说&#xff0c;无疑是巨大的惊喜&#xff08;新坑出现&…

Mace-micro引擎编译与测试

官方简介 Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台(支持Android, iOS, Linux, Windows)优化的神经网络计算框架。 主要从以下的角度做了专门的优化&#xff1a; 性能 代码经过NEON指令&#xff0c;OpenCL以及Hexagon HVX专门优化&#xff0c;并且采用W…

小米MACE开源框架搭建

一、环境配置 请参照小米官方的文档&#xff1a; https://mace.readthedocs.io/en/latest/installation/env_requirement.html For Android build, ANDROID_NDK_HOME must be confifigured by using export ANDROID_NDK_HOME/path/to/ndk It will link libc instead of gnustl …

小米AI平台MACE的构建和部署

1.准备部署文件 需要准备的部署文件包括头文件(.h), mace库文件(.)&#xff0c;转化后的模型(.a)&#xff0c;这里以resnet18v1-opt.onnx模型为例 1.1. 优化onnx模型 # Optimize your model $python MACE_ROOT/tools/onnx_optimizer.py resnet18v1.onnx resnet18v1-opt.onnx…