基于Java实现的十字链表(用来表示有向图)

数据结构+算法=程序

有向图(侵删,引用自http://blog.csdn.net/yao_zi_jie/article/details/54580283):
这里写图片描述

数据结构类——顶点:

public class Vertex<E,T>  {
    E data;
    Edge<T> firstIn;
    Edge<T> firstOut;

    public Vertex(E data) {
        this.data = data;
    }
}

数据结构类——边:

public class Edge<E> {
    E data;
    int fromVertexIndex;
    int toVertexIndex;
    Edge<E> nextSameFromVertex;
    Edge<E> nextSameToVertex;

    public Edge(E data, int fromVertexIndex, int toVertexIndex) {
        this.data = data;
        this.fromVertexIndex = fromVertexIndex;
        this.toVertexIndex = toVertexIndex;
    }
}

算法类:

package com.my;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void insertEdge(Edge<Integer> edge, List<Vertex<Integer, Integer>> vertexList) {
        int fromVertexIndex = edge.fromVertexIndex;
        int toVertexIndex = edge.toVertexIndex;
        Vertex<Integer, Integer> fromVertex = vertexList.get(fromVertexIndex);
        Vertex<Integer, Integer> toVertex = vertexList.get(toVertexIndex);

        if (fromVertex.firstOut == null) {
            //插入到顶点的出边属性
            fromVertex.firstOut = edge;
        } else {
            // 插入到edge的nextSameFromVertex属性
            Edge<Integer> tempEdge = fromVertex.firstOut;
            //找到最后一个Edge
            while (tempEdge.nextSameFromVertex != null) {
                tempEdge = tempEdge.nextSameFromVertex;
            }
            tempEdge.nextSameFromVertex = edge; 
        }
        if (toVertex.firstIn == null) {
            //插入到顶点的入边属性
            toVertex.firstIn = edge;            
        } else {
            // 插入到edge的nextSameToVertex属性
            Edge<Integer> tempEdge = toVertex.firstIn;
            //找到最后一个Edge
            while (tempEdge.nextSameToVertex != null) {
                tempEdge = tempEdge.nextSameToVertex;
            }
            tempEdge.nextSameToVertex = edge; 
        }
    }
    public static void printVertexAndEdges(List<Vertex<Integer, Integer>> list) {
        for (Vertex<Integer, Integer> vertex : list) {
            //输出入度
            String infoIn = String.format("vertex: %3d - its in-edge are: ", vertex.data);
            Edge<Integer> edge = vertex.firstIn;
            while (edge != null) {
                infoIn += String.format("(from: %d, to: %d, data: %d)", edge.fromVertexIndex, edge.toVertexIndex, edge.data);
                edge = edge.nextSameToVertex;
            }
            System.out.println(infoIn);
            //输出出度
            String infoOut = String.format("vertex: %3d - its out-edge are: ", vertex.data);
            Edge<Integer> edgeOut = vertex.firstOut;
            while (edgeOut != null) {
                infoOut += String.format("(from: %d, to: %d, data: %d)", edgeOut.fromVertexIndex, edgeOut.toVertexIndex, edgeOut.data);
                edgeOut = edgeOut.nextSameFromVertex;
            }
            System.out.println(infoOut);
        }
    }
    public static void main(String[] args) {
        int vertexNumber = 12;
        int edgeNumber = 21;
        // 检查边的数量是否正确
        // 有向完全图
        int maxEdgeNumber = vertexNumber*(vertexNumber-1); 
        if (edgeNumber < 0 || edgeNumber > maxEdgeNumber) {
            return;
        }
        // 输入有向图数据
        // 1. 先输入顶点,暂时令firstIn, firstOut为null;
        ArrayList<Vertex<Integer, Integer>> vertexList = new ArrayList<>();
        for (int i=0; i<vertexNumber; i++) {
            Vertex<Integer, Integer> v = new Vertex<>(i);
            vertexList.add(v);
        } 
        // 2. 输入边
        // 二维数组,每一行两个元素,分别是起点和终点的下标
        @SuppressWarnings("serial")
        List<Edge<Integer>> rawEdgeList = new ArrayList<Edge<Integer>>(){{
            add(new Edge<Integer>(9, 0, 1));
            add(new Edge<Integer>(7, 0, 2));
            add(new Edge<Integer>(3, 0, 3));
            add(new Edge<Integer>(2, 0, 4));
            add(new Edge<Integer>(4, 1, 5));
            add(new Edge<Integer>(2, 1, 6));
            add(new Edge<Integer>(1, 1, 7));
            add(new Edge<Integer>(2, 2, 5));
            add(new Edge<Integer>(7, 2, 6));
            add(new Edge<Integer>(11, 3, 7));
            add(new Edge<Integer>(11, 4, 6));
            add(new Edge<Integer>(8, 4, 7));
            add(new Edge<Integer>(6, 5, 8));
            add(new Edge<Integer>(5, 5, 9));
            add(new Edge<Integer>(4, 6, 8));
            add(new Edge<Integer>(3, 6, 9));
            add(new Edge<Integer>(5, 7, 9));
            add(new Edge<Integer>(6, 7, 10));
            add(new Edge<Integer>(4, 8, 11));
            add(new Edge<Integer>(2, 9, 11));
            add(new Edge<Integer>(5, 10, 11));

        }};
        for (Edge<Integer> edge : rawEdgeList) {        
            insertEdge(edge, vertexList);
        }
        //遍历顶点,输出每个顶点的出边和入边
        printVertexAndEdges(vertexList);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值