十字链表(Java)

时间:2025-02-19 07:07:36
  • /*
  • * 作者:GongchuangSu
  • * 时间:2016.03.12
  • * 功能:十字链表有向图(已提供参数)
  • * 输入说明:vexs -- 顶点数组
  • * edges -- 边数组
  • * 输出说明:十字链表(即对每个顶点vi都建立一个链接为vi为弧尾和弧头的表)
  • */
  • package test;
  • public class OListDG {
  • int vlen; // 顶点个数
  • int elen; // 边个数
  • VertexNode[] vertexNodeList; // 顶点数组
  • EdgeNode edgeNode;
  • /**
  • * 构造函数
  • * @param vexs
  • * @param edges
  • */
  • public OListDG(char[] vexs, char[][] edges) {
  • vlen = ;
  • elen = ;
  • // 初始化顶点,建立顶点表
  • vertexNodeList = new VertexNode[vlen];
  • for (int i = 0; i < vlen; i++) {
  • vertexNodeList[i] = new VertexNode();
  • vertexNodeList[i].vertex = vexs[i];
  • vertexNodeList[i].firstIn = null;
  • vertexNodeList[i].firstOut = null;
  • }
  • // 初始化边,利用头插法建立十字链表
  • for (int i = 0; i < elen; i++) {
  • EdgeNode edgeNode_1 = new EdgeNode();
  • EdgeNode edgeNode_2 = new EdgeNode();
  • int vi = getPosition(edges[i][0], vexs);
  • int vj = getPosition(edges[i][1], vexs);
  • edgeNode_1.tailvex = vi;
  • edgeNode_1.headvex = vj;
  • edgeNode_1.taillink = vertexNodeList[vi].firstOut;
  • vertexNodeList[vi].firstOut = edgeNode_1;
  • edgeNode_2.tailvex = vi;
  • edgeNode_2.headvex = vj;
  • edgeNode_2.headlink = vertexNodeList[vj].firstIn;
  • vertexNodeList[vj].firstIn = edgeNode_2;
  • }
  • }
  • /**
  • * 功能:顶点表结点结构
  • * 参数:vertex --> 顶点域,存储顶点信息
  • * firstIn --> 入边表头指针,指向该顶点的入边表中第一个结点
  • * firstOut --> 出边表头指针,指向该顶点的出边表中第一个结点
  • */
  • private class VertexNode {
  • char vertex;
  • EdgeNode firstIn;
  • EdgeNode firstOut;
  • }
  • /**
  • * 功能:边表结点
  • * 参数:tailvex --> 弧起点在顶点表的下标
  • * headvex --> 弧终点在顶点表的下标
  • * headlink --> 入边表指针域,指向终点相同的下一条边
  • * taillink --> 边表指针域,指向起点相同的下一条边
  • */
  • private class EdgeNode {
  • int tailvex;
  • int headvex;
  • EdgeNode headlink;
  • EdgeNode taillink;
  • }
  • /**
  • * 功能:返回ch位置
  • */
  • private int getPosition(char ch, char[] vexs) {
  • for (int i = 0; i < vlen; i++)
  • if (vexs[i] == ch)
  • return i;
  • return -1;
  • }
  • /**
  • * 功能:打印邻接表和逆邻接表
  • */
  • public void print() {
  • ("AdjList:\n");
  • for (int i = 0; i < vlen; i++) {
  • (vertexNodeList[i].vertex + "-->");
  • if (vertexNodeList[i].firstOut != null) {
  • EdgeNode mEdgeNode = new EdgeNode();
  • mEdgeNode = vertexNodeList[i].firstOut;
  • ();
  • while ( != null) {
  • mEdgeNode = ;
  • ();
  • }
  • ("\n");
  • } else {
  • ("\n");
  • }
  • }
  • ("----------\n");
  • ("InvAdjList:\n");
  • for (int i = 0; i < vlen; i++) {
  • (vertexNodeList[i].vertex + "<--");
  • if (vertexNodeList[i].firstIn != null) {
  • EdgeNode mEdgeNode = new EdgeNode();
  • mEdgeNode = vertexNodeList[i].firstIn;
  • ();
  • while ( != null) {
  • mEdgeNode = ;
  • ();
  • }
  • ("\n");
  • } else {
  • ("\n");
  • }
  • }
  • }
  • /**
  • * 主函数
  • */
  • public static void main(String args[]) {
  • // 顶点数组
  • char[] vexs = {
  • 'A', 'B', 'C', 'D'
  • };
  • // 边数组
  • char[][] edges = new char[][] {
  • {
  • 'A', 'B'
  • }, {
  • 'A', 'C'
  • }, {
  • 'A', 'D'
  • }, {
  • 'B', 'D'
  • }, {
  • 'C', 'D'
  • }
  • };
  • OListDG listUDG = new OListDG(vexs, edges);
  • ();
  • }
  • }