文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java怎么用邻接表存储图

2023-07-02 11:23

关注

本篇内容主要讲解“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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯