基于Java实现的十字链表(用来表示有向图)
来源:互联网 发布:不知道mac管理员用户名 编辑:程序博客网 时间:2024/05/17 08:27
数据结构+算法=程序
有向图(侵删,引用自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 0
- 基于Java实现的十字链表(用来表示有向图)
- 数据结构:有向图的十字链表存储表示(c实现)
- 有向图的十字链表
- C++十字链表实现有向图
- 十字链表存储有向图
- 有向图的十字链表存储表式
- 建立一个有向图的十字链表
- 2011.6.18 图论,有向图的十字链表
- 有向图的十字链表存储
- 有向图的十字链表存储形式
- 有向图的十字链表存储结构
- 有向图的十字链表存储
- 有向图的十字链表存储方法
- 有向图的十字链表存储表示 以及相关操作(包括增加弧、删除弧、删除顶点等)
- c语言实现十字链表储存有向图(《数据结构》算法7.3)
- 有向图的十字链表存储算法(102)
- (学习java)用十字链表表示有向图
- 看数据结构写代码(37) 图的十字链表的表示与实现
- 部署 LAMP (CentOS 7.2)
- C#中参数为引用类型加ref和不加的区别
- apache+tomcat集群及图片共享的解决办法
- spring中注解配置IOC失败异常
- IMWeb提升营Day2 | 训练题8:跳台阶
- 基于Java实现的十字链表(用来表示有向图)
- ELK
- linux deepin/ubuntu系统 远程连接windows/linux 用rdesktop
- MATLAB中的wavedec、wrcoef函数简析
- Elasticsearch学习
- 音视频数据处理(18)--- H.264的NAL层数据处理
- CSS也可以处理图片效果了哟
- 大家尽管鄙视这种人吧!
- 第一类斯特林数 hdu 3625