我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java怎么用邻接表存储图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java怎么用邻接表存储图

本篇内容主要讲解“Java怎么用邻接表存储图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么用邻接表存储图”吧!

一、点睛

邻接表是图的一种链式存储方法,其数据结构包括两部分:节点和邻接点。

用邻接表可以表示无向图,有向图和网。在此用无向图进行说明。

1.无向图

Java怎么用邻接表存储图

2.无向图的链接表

Java怎么用邻接表存储图

3.说明

节点 a 的邻接点是节点 b、d,其邻接点的存储下标为1、3,按照头插法(逆序)将其放入节点 a 后面的单链表中。

节点 b 的邻接点是节点 a、c、d,其邻接点的存储下标为0、2、3,按照头插法(逆序)将其放入节点 b 后面的单链表中。

节点 c 的邻接点是节点 b、d,其邻接点的存储下标为1、3,按照头插法(逆序)将其放入节点 c 后面的单链表中。

节点 d 的邻接点是节点 a、b、c,其邻接点的存储下标为0、1、2,按照头插法(逆序)将其放入节点 d 后面的单链表中。

4.无向图

邻接表的特点如下 如果无向图中有 n 个节点、e 条边,则节点表中有 n 个节点,邻节点表有 2e 个节点。

节点的度为该节点后面单链表中的节点数。

二、邻接表的数据结构

1.节点

包括节点信息 data 和指向第 1 个邻接点的指针 first。

Java怎么用邻接表存储图

2.邻接点

包括该邻接点的存储下标 v 和指向下一个邻接点的指针 next,如果是网的邻接点,则还需增加一个权值域 w,如下图所示。

Java怎么用邻接表存储图

三、算法步骤

1 输入节点数和边数。

2 依次输入节点信息,将其存储到节点数组 Vex[] 的 data 域中,将 Vex[] first 域置空。

3 依次输入每条边依附的两个节点,如果是网,则还需要输入该边的权值。

如果是无向图,则输入 a b,查询节点 a、b 在节点数组 Vex[] 中存储下标 i、j,创建一个新的邻接点 s,让 s.v = j;s.next=null;然后将节点 s 插入第 i 个节点的第 1 个邻接点之前(头插法)。在无向图中,从节点 a 到节点 b 有边,从节点 b 到节点 a 也有边,因此还需要创建一个新的邻接点 s2,让 s2.v = i;s2.next=null;然后让 s2 节点插入第 j 个节点的第 1 个邻接点之前(头插法)。

如果是无向图,则输入 a b,查询节点 a、b 在节点数组 Vex[] 中存储下标 i、j,创建一个新的邻接点 s,让 s.v = j;s.next=null;然后将节点 s 插入第 i 个节点的第 1 个邻接点之前(头插法)。

如果是无向网或有向网,则和无向图或有向图的处理方式一样,只是邻节点多了一个权值域。

四、实现

package graph; import java.util.Scanner; public class CreateALGraph {    static final int MaxVnum = 100;  // 顶点数最大值     public static void main(String[] args) {        ALGraph G = new ALGraph();        for (int i = 0; i < G.Vex.length; i++) {            G.Vex[i] = new VexNode();        }        CreateALGraph(G); // 创建有向图邻接表        printg(G); // 输出邻接表    }     static int locatevex(ALGraph G, char x) {        for (int i = 0; i < G.vexnum; i++) // 查找顶点信息的下标            if (x == G.Vex[i].data)                return i;        return -1; // 没找到    }     // 插入一条边    static void insertedge(ALGraph G, int i, int j) {        AdjNode s = new AdjNode();        s.v = j;        s.next = G.Vex[i].first;        G.Vex[i].first = s;    }     // 输出邻接表    static void printg(ALGraph G) {        System.out.println("----------邻接表如下:----------");         for (int i = 0; i < G.vexnum; i++) {            AdjNode t = G.Vex[i].first;            System.out.print(G.Vex[i].data + ":  ");            while (t != null) {                System.out.print("[" + t.v + "]\t");                t = t.next;            }            System.out.println();        }    }     // 创建有向图邻接表    static void CreateALGraph(ALGraph G) {        int i, j;        char u, v;         System.out.println("请输入顶点数和边数:");        Scanner scanner = new Scanner(System.in);        G.vexnum = scanner.nextInt();        G.edgenum = scanner.nextInt();        System.out.println("请输入顶点信息:");         for (i = 0; i < G.vexnum; i++)//输入顶点信息,存入顶点信息数组            G.Vex[i].data = scanner.next().charAt(0);        for (i = 0; i < G.vexnum; i++)            G.Vex[i].first = null;        System.out.println("请依次输入每条边的两个顶点u,v");         while (G.edgenum-- > 0) {            u = scanner.next().charAt(0);            v = scanner.next().charAt(0);            i = locatevex(G, u); // 查找顶点 u 的存储下标            j = locatevex(G, v); // 查找顶点 v 的存储下标            if (i != -1 && j != -1)                insertedge(G, i, j);            else {                System.out.println("输入顶点信息错!请重新输入!");                G.edgenum++; // 本次输入不算            }        }    }} // 定义邻接点类型class AdjNode {    int v; // 邻接点下标    AdjNode next; // 指向下一个邻接点} // 定义顶点类型class VexNode {    char data; // VexType为顶点的数据类型,根据需要定义    AdjNode first; // 指向第一个邻接点} // 定义邻接表类型class ALGraph {    VexNode Vex[] = new VexNode[CreateALGraph.MaxVnum];    int vexnum; // 顶点数    int edgenum; // 边数}

五、测试

白色为输出,绿色为输入

Java怎么用邻接表存储图

到此,相信大家对“Java怎么用邻接表存储图”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java怎么用邻接表存储图

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java怎么用邻接表存储图

本篇内容主要讲解“Java怎么用邻接表存储图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么用邻接表存储图”吧!一、点睛邻接表是图的一种链式存储方法,其数据结构包括两部分:节点和邻接点
2023-07-02

Java如何用邻接矩阵存储图

这篇“Java如何用邻接矩阵存储图”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何用邻接矩阵存储图”文章吧。一、点
2023-07-02

图的存储:十字链表,邻接多重表

1.十字链表存储有向图 1.存储方式 分为顶点结点和弧结点两种结构体 顶点结点使用数组顺序存储,结构体包括:数据域,作为顶点弧头的第一条弧,作为顶点弧尾的第一条弧。 弧结点,结构体包括:弧头相同的下一条弧(指向当前结点的弧),弧尾相
2023-08-30

Python怎么自定义邻接表图类

这篇文章主要介绍“Python怎么自定义邻接表图类”,在日常操作中,相信很多人在Python怎么自定义邻接表图类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么自定义邻接表图类”的疑惑有所帮助!
2023-07-04

怎么利用java存储emoji表情

这篇文章给大家介绍怎么利用java存储emoji表情,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.问题产生情况我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码
2023-05-31

Java中怎么调用存储过程

Java中怎么调用存储过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。存储过程是指保存在数据库并在数据库端执行的程序。你可以使用特殊的语法在Java类中调用存储过程。在调
2023-06-17

Highcharts图表中图例显示状态存储的功能怎么设计

这篇文章主要介绍“Highcharts图表中图例显示状态存储的功能怎么设计”,在日常操作中,相信很多人在Highcharts图表中图例显示状态存储的功能怎么设计问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”H
2023-07-05

怎么在HTML5中使用IndexDB存储图像

本篇文章为大家展示了怎么在HTML5中使用IndexDB存储图像,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、创建或打开数据库。// IndexedDBwindow.indexedDB = wi
2023-06-09

redis怎么使用hash存储java对象

利用RedisHash存储Java对象,通过序列化将对象转换为字节数组,并按键-值对存储在Hash中。优点包括快速检索、数据组织和空间优化。注意事项涉及序列化大小、数据完整性和数据过期。替代方案包括字符串、列表和集合,具体选择取决于需求和性能要求。
redis怎么使用hash存储java对象
2024-04-11

Oracle中怎么调用Java存储过程

这期内容当中小编将会给大家带来有关Oracle中怎么调用Java存储过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、如何创建java存储过程?通常有三种方法来创建java存储过程。1. 使用orac
2023-06-17

redis怎么使用hash存储java对象

你可以使用Redis的Hash数据结构来存储Java对象。在Java中,你可以将对象转换为JSON格式,然后将JSON字符串存储在Redis的Hash中。首先,你需要确保你的Java对象能够被转换为JSON字符串。你可以使用任何JSON库
redis怎么使用hash存储java对象
2024-04-09

sql存储过程中临时表怎么使用

在SQL存储过程中,可以使用临时表来存储中间结果或者临时数据。以下是使用临时表的一般步骤:1. 创建临时表:在存储过程的开始部分,使用CREATE TABLE语句创建临时表。临时表可以使用#作为表名的前缀,表示它是一个局部临时表。例如:CR
2023-08-23

java存储过程怎么调用OS命令

小编给大家分享一下java存储过程怎么调用OS命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 先看一下这个目录[oracle@ocean ~]$ pwd/
2023-06-03

Java怎么使用Set接口存储没有重复元素的数组

本篇内容主要讲解“Java怎么使用Set接口存储没有重复元素的数组”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么使用Set接口存储没有重复元素的数组”吧!Set接口 S
2023-06-30

怎么用Java保存位图文件

这篇文章主要介绍“怎么用Java保存位图文件”,在日常操作中,相信很多人在怎么用Java保存位图文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java保存位图文件”的疑惑有所帮助!接下来,请跟着小编
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录