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

本文介绍如何使用Java实现图的邻接表数据结构,包括结点类的定义、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;
    }
}

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("对不起,此人物不存在!");
    }
}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值