邻接表(Java)

来源:互联网 发布:手机淘宝改差评步骤 编辑:程序博客网 时间:2024/06/10 23:45

一、邻接表无线图

无向图的邻接表结构如下所示:


无向图的邻接表的代码实现:

/* * 邻接表无向图(已提供参数) * 输入说明:vexs  --  顶点数组 *    edges  --  边数组 * 输出说明:邻接表(即每个顶点所连接的点) */package test;public class ListUDG {    int vlen; // 顶点个数    int elen; // 边个数    VertexNode[] vertexNodeList; // 顶点数组    EdgeNode edgeNode;    /**     * 构造函数     * @param vexs     * @param edges     */    public ListUDG(char[] vexs, char[][] edges) {        vlen = vexs.length;        elen = edges.length;        // 初始化顶点,建立顶点表        vertexNodeList = new VertexNode[vlen];        for (int i = 0; i < vlen; i++) {            vertexNodeList[i] = new VertexNode();            vertexNodeList[i].vertex = vexs[i];            vertexNodeList[i].firstedge = 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.adjvex = edges[i][1];            edgeNode_1.next = vertexNodeList[vi].firstedge;            vertexNodeList[vi].firstedge = edgeNode_1;            edgeNode_2.adjvex = edges[i][0];            edgeNode_2.next = vertexNodeList[vj].firstedge;            vertexNodeList[vj].firstedge = edgeNode_2;        }    }    /**     *  顶点表结点     */    private class VertexNode {        char vertex; // 顶点域,存储顶点信息        EdgeNode firstedge; // 边表头指针    }    /**     *  边表结点     */    private class EdgeNode {        char adjvex; // 邻接点域,存储该顶点对应的下标        EdgeNode next; // 链域,指向下一个邻接点    }    /**     *  返回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() {        System.out.printf("AdjList:\n");        for (int i = 0; i < vlen; i++) {            System.out.print(vertexNodeList[i].vertex + "-->");            if (vertexNodeList[i].firstedge != null) {                EdgeNode mEdgeNode = new EdgeNode();                mEdgeNode = vertexNodeList[i].firstedge;                System.out.print(mEdgeNode.adjvex);                while (mEdgeNode.next != null) {                    mEdgeNode = mEdgeNode.next;                    System.out.print(mEdgeNode.adjvex);                }                System.out.print("\n");            } else {                System.out.print("\n");            }        }    }    /**     * 主函数     * @param args     */    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'            }        };        ListUDG listUDG = new ListUDG(vexs, edges);        listUDG.print();    }}

代码输出结果:

AdjList:A-->DCBB-->DAC-->DAD-->CBA

二、邻接表有向图

有向图的邻接表结构如下所示:


有向图的邻接表的代码实现:

/* * 邻接表有向图(已提供参数) * 输入说明:vexs  --  顶点数组 *    edges  --  边数组 * 输出说明:邻接表(即对每个顶点vi都建立一个链接为vi为弧尾的表) */package test;public class ListDG {    int vlen; // 顶点个数    int elen; // 边个数    VertexNode[] vertexNodeList; // 顶点数组    EdgeNode edgeNode;    /**     * 构造函数     * @param vexs     * @param edges     */    public ListDG(char[] vexs, char[][] edges) {        vlen = vexs.length;        elen = edges.length;        // 初始化顶点,建立顶点表        vertexNodeList = new VertexNode[vlen];        for (int i = 0; i < vlen; i++) {            vertexNodeList[i] = new VertexNode();            vertexNodeList[i].vertex = vexs[i];            vertexNodeList[i].firstedge = null;        }        // 初始化边,利用头插法建立邻接表        for (int i = 0; i < elen; i++) {            EdgeNode edgeNode = new EdgeNode();            int vi = getPosition(edges[i][0], vexs);            int vj = getPosition(edges[i][1], vexs);                         edgeNode.adjvex = edges[i][1];            edgeNode.next = vertexNodeList[vi].firstedge;            vertexNodeList[vi].firstedge = edgeNode;        }    }    /**     *  顶点表结点     */    private class VertexNode {        char vertex; // 顶点域,存储顶点信息        EdgeNode firstedge; // 边表头指针    }    /**     *  边表结点     */    private class EdgeNode {        char adjvex; // 邻接点域,存储该顶点对应的下标        EdgeNode next; // 链域,指向下一个邻接点    }    /**     *  返回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() {        System.out.printf("AdjList:\n");        for (int i = 0; i < vlen; i++) {            System.out.print(vertexNodeList[i].vertex + "-->");            if (vertexNodeList[i].firstedge != null) {                EdgeNode mEdgeNode = new EdgeNode();                mEdgeNode = vertexNodeList[i].firstedge;                System.out.print(mEdgeNode.adjvex);                while (mEdgeNode.next != null) {                    mEdgeNode = mEdgeNode.next;                    System.out.print(mEdgeNode.adjvex);                }                System.out.print("\n");            } else {                System.out.print("\n");            }        }    }    /**     * 主函数     * @param args     */    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'            }        };        ListDG listDG = new ListDG(vexs, edges);        listDG.print();    }}
代码输出结果:

AdjList:A-->DCBB-->DC-->DD-->




0 0