Java数据结构——图-邻接表

数据结构5—图-邻接表 java实现 一、概述邻接表处理方法: 用一位数组存储顶点(为何不用单链表存储?数组可以较容易获得读取顶点信息),此外,每个数据元素还存储指向第一个邻接点的指针; 每个顶点Vi的所有邻接点构成一个线性表。data:数据域,存储顶点Vi的名或其他信息 firstedge:指针域,指向此顶点的第一个邻接点adjvex:邻接点域,指示与Vi连接的节点在图中的位置 info:存储边或弧的相关信息,如权值,边编号等 ne 阅读详情

用图-邻接表实现以下功能。有类似需求的也可以参考一下。
用图-邻接表实现如图功能
结点的关系图如下:
请添加图片描述

结点类和有参构造方法

/**
 * 弧结点,表结点
 */
class arcNode {
    String name;    //存储相关人物的名字
    String relation;    //存储相关人物和主人公的关系
    arcNode nextNode;   //指向下一个结点的地址域

    public arcNode(String name, String relation){
        this.name = name;
        this.relation = relation;
    }
}


/**
 * 顶点,表头结点
 */
class vexNode {
    int E = 0;      //表示连接这个顶点的边的数量
    String name;    //存储主人公名字
    arcNode firstArc;   //指针域

    /**
     * 尾插法,为表头结点添加邻接点和边的信息
     * @param index:相关人物对应的顶点下标
     * @param relation:相关人物和主人公的关系
     * **/
    public void linkedLast(int index,String relation){
        arcNode newNode = new arcNode(vexs[index].name,relation);
        if (this.E==0){
            this.firstArc = newNode;
        }else {
            //生成一个临时指针遍历至最后一个表结点
            arcNode tempNode = this.firstArc;
            while (tempNode.nextNode != null){
                tempNode = tempNode.nextNode;
            }
            //将新结点接到最后一个结点的后面
            tempNode.nextNode = newNode;
        }
        this.E++;
    }
}

/**
 * 顶点数组
 */
vexNode[] vexs;

/**
 * 构造方法,构造出只有顶点的图
 * *
 * @param vertex:各个顶点对应的名字的数组
 */
public Graph(String[] vertex) {

    // 1.设置顶点数组大小
    vexs = new vexNode[vertex.length];

    // 2.初始化顶点数组
    for (int i = 0; i < vexs.length; i++) {
        vexs[i] = new vexNode();
        vexs[i].name = vertex[i];
        vexs[i].firstArc = null;
    }
}

Graph类的成员方法

/**
 * 给两个相邻顶点添加边
 * @param index_1 :人物1对应的顶点下标
 * @param index_2 :人物2对应的顶点下标
 * @param relation :两个人物之间的关系
 * **/
public void addEdge(int index_1, int index_2, String relation){
    vexs[index_1].linkedLast(index_2,relation);
    vexs[index_2].linkedLast(index_1,relation);
}

/**
 * 查找某个人物在顶点数组中的下标,存在则返回其下标,不存在则返回-1
 * @param name :要查找的人物的姓名
 * **/
public int indexOf(String name){
    //存在就返回该联系人的数组下标
    for (int i=0;i< vexs.length;i++){
        if (vexs[i].name.equals(name)){
            return i;
        }
    }
    return -1;  //不存在则返回-1
}

/**
 * 打印邻接表
 * @param index :要打印的人物的顶点下标
 * **/
public void printArc(int index){
    if (vexs[index].E==0){
        System.out.println("对不起,此人物不存在相关人物");
    }else {
        //遍历打印出信息
        System.out.println(vexs[index].name+"的相关人物和关系如下:");
        arcNode tempNode = vexs[index].firstArc;
        while (tempNode != null){
            System.out.println(tempNode.name+"--->"+tempNode.relation);
            tempNode = tempNode.nextNode;   //后移
        }
    }
}

/**
 * 实现查询某个人物的相关人物和关系
 * **/
public void findArc(){
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入您要查询关系网的人物名字:");
    String find_name = sc.next();
    //查询到此人对应的顶点数组
    int ret = indexOf(find_name);
    if (ret != -1){
        printArc(ret);
    }else {
        System.out.println("对不起,此人物不存在!");
    }
}

测试数据

public class GraphTest {
public static void main(String[] args) {
    //创建人物姓名数组
    String[] str_name = {"程家阳","王旭东","文晓华","李雷","张翘楚","乔菲","吴嘉怡","高家明"};
    //构造图
    Graph graph = new Graph(str_name);
    //添加边,即人物关系
    graph.addEdge(0,1,"好友");
    graph.addEdge(0,2,"初恋");
    graph.addEdge(0,3,"同事");
    graph.addEdge(0,4,"母亲");
    graph.addEdge(0,5,"相爱");
    graph.addEdge(1,6,"喜欢");
    graph.addEdge(2,5,"情敌");
    graph.addEdge(2,7,"一厢情愿");
    graph.addEdge(3,5,"同事");
    graph.addEdge(4,5,"反对在一起");
    graph.addEdge(5,6,"喜欢");
    graph.addEdge(5,7,"前男友");

    //查询人物关系网
    graph.findArc();
 }
}

Graph类合并的源码

import java.util.Scanner;

public class Graph {
/**
 * 弧结点,表结点
 */
class arcNode {
    String name;    //存储相关人物的名字
    String relation;    //存储相关人物和主人公的关系
    arcNode nextNode;   //指向下一个结点的地址域

    public arcNode(String name, String relation){
        this.name = name;
        this.relation = relation;
    }
}


/**
 * 顶点,表头结点
 */
class vexNode {
    int E = 0;      //表示连接这个顶点的边的数量
    String name;    //存储主人公名字
    arcNode firstArc;   //指针域

    /**
     * 尾插法,为表头结点添加邻接点和边的信息
     * @param index:相关人物对应的顶点下标
     * @param relation:相关人物和主人公的关系
     * **/
    public void linkedLast(int index,String relation){
        arcNode newNode = new arcNode(vexs[index].name,relation);
        if (this.E==0){
            this.firstArc = newNode;
        }else {
            //生成一个临时指针遍历至最后一个表结点
            arcNode tempNode = this.firstArc;
            while (tempNode.nextNode != null){
                tempNode = tempNode.nextNode;
            }
            //将新结点接到最后一个结点的后面
            tempNode.nextNode = newNode;
        }
        this.E++;
    }
}

/**
 * 顶点数组
 */
vexNode[] vexs;

/**
 * 构造方法,构造出只有顶点的图
 * *
 * @param vertex:各个顶点对应的名字的数组
 */
public Graph(String[] vertex) {

    // 1.设置顶点数组大小
    vexs = new vexNode[vertex.length];

    // 2.初始化顶点数组
    for (int i = 0; i < vexs.length; i++) {
        vexs[i] = new vexNode();
        vexs[i].name = vertex[i];
        vexs[i].firstArc = null;
    }
}

/**
 * 给两个相邻顶点添加边
 * @param index_1 :人物1对应的顶点下标
 * @param index_2 :人物2对应的顶点下标
 * @param relation :两个人物之间的关系
 * **/
public void addEdge(int index_1, int index_2, String relation){
    vexs[index_1].linkedLast(index_2,relation);
    vexs[index_2].linkedLast(index_1,relation);
}

/**
 * 查找某个人物在顶点数组中的下标,存在则返回其下标,不存在则返回-1
 * @param name :要查找的人物的姓名
 * **/
public int indexOf(String name){
    //存在就返回该联系人的数组下标
    for (int i=0;i< vexs.length;i++){
        if (vexs[i].name.equals(name)){
            return i;
        }
    }
    return -1;  //不存在则返回-1
}

/**
 * 打印邻接表
 * @param index :要打印的人物的顶点下标
 * **/
public void printArc(int index){
    if (vexs[index].E==0){
        System.out.println("对不起,此人物不存在相关人物");
    }else {
        //遍历打印出信息
        System.out.println(vexs[index].name+"的相关人物和关系如下:");
        arcNode tempNode = vexs[index].firstArc;
        while (tempNode != null){
            System.out.println(tempNode.name+"--->"+tempNode.relation);
            tempNode = tempNode.nextNode;   //后移
        }
    }
}

/**
 * 实现查询某个人物的相关人物和关系
 * **/
public void findArc(){
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入您要查询关系网的人物名字:");
    String find_name = sc.next();
    //查询到此人对应的顶点数组
    int ret = indexOf(find_name);
    if (ret != -1){
        printArc(ret);
    }else {
        System.out.println("对不起,此人物不存在!");
    }
}

}

有向图的邻接表和邻接矩阵 具体来说,有向图的邻接表由一个由节点和它们的邻居节点列表组成的集合构成。这种表示方法可以用一个哈希表或数组来实现,其中哈希表或数组的键或索引表示节点,对应的值是一个列表,存储了该节点的所有邻居节点。具体来说,可以使用 Map,其中键是节点的名称(如字符串表示),值是一个列表,存储了该节点指向的所有邻居节点的名称。有向图的邻接表是一种常用的表示方法,用于表示图中各个节点之间的关系。在有向图中,每条边都有一个方向,因此邻接表中的每个节点记录了该节点指向的其他节点。 阅读详情

相关推荐

图论——图的邻接表实现——Java语言(完整demo)

一、图的实现方式概述 1、图的简单实现方法——邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法。 对于每条边(u,v),置A[u,v]等于true;否则,数组的元素就是false。如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权来标记不存在的边。虽然这样表示非常简单,但是,它的空间需求则为θ...

zhoucheng05_13的博客 7475

Hadoop之金庸江湖人物关系网分析

项目设计目的 通过一个综合数据分析案例:”金庸的江湖——金庸武侠小说中的人物关系挖掘“,来学习和掌握MapReduce程序设计。通过本项目的学习,可以体会如何使用MapReduce完成一个综合性的数据挖掘任务,包括全流程的数据预处理、数据分析、数据后处理等。 1 任务1 数据预处理 1.1 任务描述 从原始的金庸小说文本中,抽取出与人物互动相关的数据,而屏蔽掉与人物关系无关的文本内容,为后...

zhangMY12138的博客 3026

数据结构——图的存储方式(java实现)

① 邻接矩阵 图的邻接矩阵存储方式是用两个数组表示。 一个一维数组储存图的顶点(V)信息,一个二维数组储存图的边或是弧(E)的信息。 假如图G有n个顶点,则邻接矩阵是一个nXn的方阵,定义为: 如下无向图: 如下有向图: 邻接矩阵的数据结构: Class MGraph{ int numNodes;// 顶点个数 String[] vexs = new S...

hades0525的博客 2211

日撸 Java 三百行(36 天: 邻接表的代码实现)

这里是JAVA自学与了解的同步笔记与记录,如有问题欢迎指正说明

ALBlack的博客 2656

深信服桌面云实战:从零部署到高效运维的关键配置指南

本文提供了一份深信服桌面云从零部署到高效运维的实战指南。内容涵盖项目启动阶段的资源、网络与存储规划,详细演示了VMP与VDC平台的安装与对接,并深入讲解了制作虚拟机模板、配置用户体系、优化终端策略等核心步骤。最后,分享了包括CPU公平分配、智能调度在内的关键性能调优与高阶运维技巧,旨在帮助管理员构建稳定、高效的云桌面环境。

blockchain9miner的博客 452

mtk-drm初始化

mtk-drm初始化走读

zhexingsunba的博客 4940

java数据结构之图(邻接矩阵和邻接表)

JAVA数据结构之图 1、图的介绍和原理 1.1、图的基本概念 图是由顶点集(VertexSet)和边集(EdgeSet)组成,针对图G,顶点集和边集分别记为V(G)和E(G)。依据图的边集是否为有向,可把图分为有向图和无向图,根据图是否有权重,可以分为有权图和无权图。 图的基本术语: 1:邻接点----在一个无向图中,若存在一条边(Vi,Vj),则称Vi,Vj为此边的两个端点,并称它们

xxniuren的专栏 2万+

Ubuntu20.04下Intel RealSense D435i相机驱动配置全攻略(含ROS Noetic适配)

本文详细介绍了在Ubuntu20.04系统下配置Intel RealSense D435i相机驱动的完整流程,包括libRealsense SDK 2.0安装、ROS Noetic适配及常见问题解决方案。通过实战指南帮助开发者快速实现深度相机与ROS的集成,适用于机器人视觉和SLAM应用开发。

weixin_29281915的博客 513

数据结构java(十二)图②邻接表实现(一维数组+链表)

1.邻接表实现(GraphAdjList) import java.lang.reflect.Array; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; /** * 稀疏图 * 邻接表实现 * @author Administrator */ public class ...

菜鸟_zhengke的博客 542

Verilog数字钟

使用Verilog语言进行的数字钟的编写,FPGA开发板亲测正常 大学生一个,第一次自己做的东西,写出来分享在这里插入代码片一下,有不对的地方请大家批评指正。 这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;按键2,3用于调整时间,仅当数字钟处于...

bin_bin_bun的博客 6150

点云直线检测-3DLineDetection复现

点云直线分割-Fast 3D line detection

阁楼 8156

JAVA数据结构与算法之————图(邻接表)

JAVA数据结构与算法之————图(邻接表) 图节点结构: public class VertexNode { /*节点数据*/ public String data; /*指向第一边节点的指针*/ public EdgeNode firstedge; /*标记节点是否被访问*/ public boolean isVisited; ...

qq_36007633的博客 773

【VeriStand】从零构建HIL测试平台:核心概念、硬件选型与实战配置指南

本文详细介绍了如何从零构建HIL测试平台,涵盖核心概念、硬件选型与实战配置指南。重点解析了VeriStand生态系统的优势,包括开箱即用特性、与LabVIEW的黄金搭档配合及Python支持。通过实战案例和硬件选型建议,帮助工程师高效搭建可靠的HIL测试平台,提升测试效率与安全性。

weixin_29250573的博客 329

【数据结构】图-图的存储_邻接表(图解、c++、java)

URLeisure的图的存储_邻接表“完美”复习资料。

扑腾的江鱼复习仓库 4811

WinCC实现定时存储数据至SQLServer

环境 Win10 WinCC V7.5 SQL Server 2016 运行结果 流程 WinCC变量 全局VB脚本 (我设置的是每2秒存一次,因此周期性触发器设置1秒)

skr? 3990

MinerU在线API异步调用代码开发示例

本文展示了如何使用Python异步编程调用MinerU在线API进行文件批量上传。代码示例包含三个主要功能:1) 通过API密钥获取文件上传URL;2) 使用信号量控制并发上传多个文件;3) 获取提取结果。实现采用httpx异步客户端和asyncio库,支持文件存在性检查、错误处理和日志记录。示例中演示了如何上传PDF文件到MinerU平台,并提供了获取批量处理结果的接口。该代码可作为异步调用MinerU API的参考实现。

拥抱具身智能,昇腾Ascend C 357

java数据结构-----图(邻接矩阵和邻接表)

  https://blog.youkuaiyun.com/xxniuren/article/details/52218211 JAVA数据结构之图 1、图的介绍和原理 1.1、图的基本概念 图是由顶点集(VertexSet)和边集(EdgeSet)组成,针对图G,顶点集和边集分别记为V(G)和E(G)。依据图的边集是否为有向,可把图分为有向图和无向图,根据图是否有权重,可以分为有权图和无权图。 ...

evior 4210

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【数据结构】图(邻接矩阵、邻接表)的JAVA代码实现

图是不同于树的另一种非线性数据结构。在树结构中,数据元素之间存在着一种层次结构的关系,每一层上的数据元素可以和下一层的多个数据元素相关,但只能和上一层的单个数据元素相关。也就是说,树结构的数据元素之间是一种一对多的关系;在图结构中,数据元素之间的关系则是多对多的关系。即图中的每个数据元素可以和图中任意别的数据元素相关,所以图是一种比树更复杂的数据结构。 树结构可以看做是图的一种特例。   图...

Yngz_Miao的博客 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 图 算法,数据结构-图 的JAVA实现(上)

数据结构--图 的JAVA实现(上)1,摘要:本系列文章主要学习如何使用JAVA语言以邻接表的方式实现了数据结构---图(Graph),这是第一篇文章,学习如何用JAVA来表示图的顶点。从数据的表示方法来说,有二种表示图的方式:一种是邻接矩阵,其实是一个二维数组;一种是邻接表,其实是一个顶点表,每个顶点又拥有一个边列表。下图是图的邻接表表示。从图中可以看出,图的实现需要能够表示顶点表,能够表示边表...

weixin_34636056的博客 454

图-邻接表

用一维数组存储顶点类,顶点data存储顶点信息,adj存储顶点邻接表。先定义图要实现的方法。

weixin_44915419的博客 252

java邻接图_Java数据结构 - 图(邻接表存储)

邻接表相比邻接矩阵,邻接表要更加节省空间。邻接表存储本文将介绍邻接表存储有向带权图。图的例子如下。图介绍一下邻接表上面的图对应的邻接表如下图所示:邻接表前面的数组存储的是所有的顶点,每一个顶点后面连接的块代表前面顶点所指向的顶点和路线的权值。如果该点还指向其他顶点,则继续在块后面添加。例如A指向了B权值是4,那么A后面就加上一块,之后发现A还指向D权值是5,那么就在块尾继续添加一块。其实也就是数组...

weixin_33273250的博客 741

数据结构之邻接表

数据结构之邻接表

weixin_47225948的博客 3869

数据结构Java版之邻接表实现图(十)

  邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点。    package mygraph; import java.util.ArrayList; import java.util.List; public class Table { private List<List<Character>> list; ...

weixin_30919235的博客 161

Java数据结构——邻接矩阵+邻接表

{- 邻接矩阵, c, java} {- 邻接表, c, java。尾插法,挂接}

NoBug 3056
上一篇: Java数据结构——用顺序表编写一个简易通讯录
Jay_Java_
博客等级 码龄5年 206粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值