Java实现十字链表

使用Java实现十字链表数据结构

存在着3个自定义类——Graph2、Data2、Vertex2,Graph用于定义图,Data2用于表示顶点节点的Struct,Vertex用于表示弧节点的Struct,定义同教材。

文件1-Graph2.java

package orthogonallist;

public class Graph2 {
    //自定义图,可存储50个节点
    Data2[] dianArray = new Data2[50];
    //记录定点数和边数
    int verNum=0;
    int edgeNum=0;
}

文件2-Data2.java

package orthogonallist;

public class Data2{
    //元素,首弧
    String data; //顶点名
    Vertex2 inArc,outArc; //入弧与出弧
}

文件3-Vertex2.java

package orthogonallist;

public class Vertex2{
    //弧头元素,弧尾元素,同弧头指针,同弧尾指针
    String vh,vt; //VertexHead VertexTail
    Vertex2 SimilarHeadVer,SimilarTailVer;
    //int info; //权值
}

文件4-OLtest.java

package orthogonallist;

import java.util.Scanner;

public class OLtest {

    public Data2 getVertex(Graph2 graph, String str) {
        for (int i = 0; i < graph.verNum; i++) {
            if (graph.dianArray[i].data.equals(str)) { 
                return graph.dianArray[i];
            }
        }
        return null;
    }

    public void initialGraph(Graph2 graph) {
        // 初始化十字链表
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入顶点数和边数:");
        try {
            graph.verNum = scan.nextInt();
            graph.edgeNum = scan.nextInt();
        } catch (Exception e) {
            System.out.println(e);
            return;
        }
        System.out.println("请依次输入顶点名称:");
        for (int i = 0; i < graph.verNum; i++) {
            String name = scan.next();
            Data2 dian = new Data2();
            dian.data = name;
            dian.inArc = null;
            dian.outArc = null;
            graph.dianArray[i] = dian;
        }

        System.out.println("请依次输入图的边:(格式为 ‘a b’ 表示存在边 a—>b )");
        for (int i = 0; i < graph.edgeNum; i++) {

            String preV = scan.next();
            String folV = scan.next();

            Data2 d1 = getVertex(graph, preV);
            Vertex2 current = new Vertex2();// 当指针用,记录当前寻找到到最后的弧节点
            if (d1 == null) {
                System.out.println("输入边存在图中没有的顶点!");
                return;
            } else {
                Vertex2 v2 = new Vertex2();
                v2.vh = folV;
                v2.vt = preV;
                if (d1.outArc == null) {
                    d1.outArc = v2;
                    v2.SimilarTailVer = null;
                    v2.SimilarHeadVer = null;
                } else {
                    current = d1.outArc;
                    while (current != null) {
                        if(current.SimilarTailVer == null)
                            break;
                        current = current.SimilarTailVer;
                    }
                    current.SimilarTailVer = v2;
                    v2.SimilarTailVer = null;
                    v2.SimilarHeadVer = null;
                    current = v2;//方便设置弧头调用当前的Vertex
                }
            }

            Data2 d2 = getVertex(graph, folV);
            if (d2 == null) {
                System.out.println("输入边存在图中没有的顶点!");
                return;
            } else {
                if (d2.inArc == null)
                    d2.inArc = current;
                else {
                    Vertex2 v2 = new Vertex2();
                    v2 = d2.inArc;
                    while (v2.SimilarHeadVer != null) {
                        v2 = v2.SimilarHeadVer;
                    }
                    v2.SimilarHeadVer = current;
                }
            }
        }
    }

    public void outputGraph(Graph2 graph) {
        // 输出十字链表
        //直接通过SimilarHeadVer与SimilarTailVer不断追查即可
        System.out.println("输出图的十字链表为:");
        for (int i = 0; i < graph.verNum; i++) {
            Data2 dt = graph.dianArray[i];
            System.out.print(dt.data);
            Vertex2 current = dt.outArc;
            while (current != null) {
                System.out.print("->" + current.vh);
                if(current.SimilarTailVer == null)
                    break;
                current = current.SimilarTailVer;
            }
            System.out.println();
        }

        System.out.println("十字链表各节点详细信息如下:");
        int count = 0;
        for(int i = 0; i < graph.verNum; i++){
            Data2 dt = graph.dianArray[i];
            System.out.print(dt.data+"顶点的入度为:");
            Vertex2 current = new Vertex2();
            if(dt.inArc != null){
                current = dt.inArc;
                count++;
                while(current.SimilarHeadVer != null){
                    count++;
                    current = current.SimilarHeadVer;
                }
            }
            System.out.print(count + ",  ");
            count = 0;
            System.out.print(dt.data+"顶点的出度为:");
            Vertex2 current1 = new Vertex2();
            if(dt.outArc != null){
                current1 = dt.outArc;
                count++;
                while(current1.SimilarTailVer != null){
                    count++;
                    current1 = current1.SimilarTailVer;
                }
            }
            System.out.println(count);
            count = 0;
        }
    }

    public static void main(String[] args) {
        Graph2 graph = new Graph2();
        OLtest createGraph = new OLtest();
        createGraph.initialGraph(graph);
        createGraph.outputGraph(graph);
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值