数据结构学习——图的邻接表(无向图,带权值有向图)

本文介绍了数据结构中的邻接表,作为无向图和带权值有向图的存储方式,相较于邻接矩阵,邻接表更节省空间。通过邻接点的链表结构和顶点数组进行存储,并展示了如何添加权值属性。最后,给出了创建邻接表的代码示例。
部署运行你感兴趣的模型镜像

邻接表是数组与链表相结合的存储方法,相比于顺序存储结构(邻接矩阵),节省空间。
来个小例子(无向图):
图图1

图1邻接表的结构:
这里写图片描述
邻接表用链表来存储邻接点(分两个域,一个存顶点下标,一个存下一个邻接点的引用),通过一个类(我用了内部类,所以是private)定义邻接点:

private class AdgvexType {
        int verNum = -1;//存储顶点数组下标,默认零
        AdgvexType adg = null;//存储下一个邻接点的引用

        public int getVerNum() {
            return verNum;
        }

        public void setVerNum(int verNum) {
            this.verNum = verNum;
        }

        public int getWeightNum() {
            return weightNum;
        }

        public void setWeightNum(int weightNum) {
            this.weightNum = weightNum;
        }

        public AdgvexType getAdg() {
            return adg;
        }

        public void setAdg(AdgvexType adg) {
            this.adg = adg;
        }

        @Override
        public String toString() {
            return "AdgvexType [verNum=" + verNum + ", weightNum=" + weightNum
                    +  "]";
        }

    }

邻接表用数组存储图的顶点,数组中每个元素包含两个域(一个存顶点,一个存它第一个临界点的引用),定义顶点数组:

private VertexeType[] verArr;// 顶点数组

    // 顶点数据
    private class VertexeType {
        String vertexe = null;//存储顶点
        AdgvexType adg = null;//存储第一个邻接点的引用

        public VertexeType() {
        }

        public VertexeType(String vertexe) {
            this.vertexe = vertexe;
        }

        public String getVertexe() {
            return vertexe;
        }

        public void setVertexe(String vertexe) {
            this.vertexe = vertexe;
        }

        public AdgvexType getAdg() {
            return adg;
        }

        public void setAdg(AdgvexType adg) {
            this.adg = adg;
        }

        @Override
        public String toString() {
            return "VertexeType [vertexe=" + vertexe + ", adg=" + adg + "]";
        }

    }

再说说带权值的有向图(在原来的基础上):
这里写图片描述图2
需要多记录一项属性(权值),对邻接点类型加一个域,来存储权值,结构如下:
这里写图片描述
class AdgvexType类加一条属性(成员变量)即可:

int weightNum = 0;

通过构造方法为顶点数组赋值:

    public AdjacencyList(String[] arr) {
        this.MAXVEX = arr.length;
        this.verArr = new VertexeType[this.MAXVEX];
        for (int i = 0; i < arr.length; i++) {
            this.verArr[i] = new VertexeType(arr[i]);
        }
    }

通过二维数组添加所有邻接点:

    public void addAdg(String[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            AdgvexType temp = null;
            int[] pos = this.getPosition(arr[i]);
            AdgvexType adg = new AdgvexType();
            adg.setWeightNum(Integer.valueOf( arr[i][2]));//设置权值
            adg.setVerNum(pos[1]);
            temp = this.verArr[pos[0]].getAdg();
            if (temp == null) {
                this.verArr[pos[0]].setAdg(adg);
                continue;
            }
            while (true) {
                if (temp.getAdg() != null) {
                    temp = temp.getAdg();
                } else {
                    temp.setAdg(adg);
                    break;
                }
            }
        }

    }
    //查找顶点位置
    private int[] getPosition(String[] arr) {
        int[] arrInt = new int[2];
        for (int i = 0; i < this.MAXVEX; i++) {
            if (this.verArr[i].getVertexe().equals(arr[0])) {
                arrInt[0] = i;
                break;
            }
        }
        for (int i = 0; i < this.MAXVEX; i++) {
            if (this.verArr[i].getVertexe().equals(arr[1])) {
                arrInt[1] = i;
                break;
            }
        }
        return arrInt;
    }

测试代码:

package com.nuc.Graph;

public class TestAdg {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub
                String[] str={"v0","v1","v2","v3"};
                AdjacencyList adj=new AdjacencyList(str);
                String[][] edges=new String[][]{
                        {"v0","v3","5"},//顶点,顶点,权值
                        {"v1","v0","1"},
                        {"v1","v2","3"},
                        {"v2","v0","7"},
                        {"v2","v1","4"}
                };
                adj.addAdg(edges);
                adj.show();
    }

}

下边是完整代码:

import java.util.Arrays;

public class AdjacencyList {
    private int MAXVEX;// 顶点数组长度
    private VertexeType[] verArr;// 顶点数组

    // 顶点数据
    private class VertexeType {
        String vertexe = null;
        AdgvexType adg = null;

        public VertexeType() {
        }

        public VertexeType(String vertexe) {
            this.vertexe = vertexe;
        }

        public String getVertexe() {
            return vertexe;
        }

        public void setVertexe(String vertexe) {
            this.vertexe = vertexe;
        }

        public AdgvexType getAdg() {
            return adg;
        }

        public void setAdg(AdgvexType adg) {
            this.adg = adg;
        }

        @Override
        public String toString() {
            return "VertexeType [vertexe=" + vertexe + ", adg=" + adg + "]";
        }

    }

    // 边表节点
    private class AdgvexType {
        int verNum = -1;
        int weightNum = 0;
        AdgvexType adg = null;

        public int getVerNum() {
            return verNum;
        }

        public void setVerNum(int verNum) {
            this.verNum = verNum;
        }

        public int getWeightNum() {
            return weightNum;
        }

        public void setWeightNum(int weightNum) {
            this.weightNum = weightNum;
        }

        public AdgvexType getAdg() {
            return adg;
        }

        public void setAdg(AdgvexType adg) {
            this.adg = adg;
        }

        @Override
        public String toString() {
            return "AdgvexType [verNum=" + verNum + ", weightNum=" + weightNum
                    +  "]";
        }

    }

    // 初始化,为顶点数组赋值
    public AdjacencyList(String[] arr) {
        this.MAXVEX = arr.length;
        this.verArr = new VertexeType[this.MAXVEX];
        for (int i = 0; i < arr.length; i++) {
            this.verArr[i] = new VertexeType(arr[i]);
        }
    }

    public void addAdg(String[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            AdgvexType temp = null;
            int[] pos = this.getPosition(arr[i]);
            AdgvexType adg = new AdgvexType();
            adg.setVerNum(pos[1]);
            temp = this.verArr[pos[0]].getAdg();
            if (temp == null) {
                this.verArr[pos[0]].setAdg(adg);
                continue;
            }
            while (true) {
                if (temp.getAdg() != null) {
                    temp = temp.getAdg();
                } else {
                    temp.setAdg(adg);
                    break;
                }
            }
        }

    }

    private int[] getPosition(String[] arr) {
        int[] arrInt = new int[2];
        for (int i = 0; i < this.MAXVEX; i++) {
            if (this.verArr[i].getVertexe().equals(arr[0])) {
                arrInt[0] = i;
                break;
            }
        }
        for (int i = 0; i < this.MAXVEX; i++) {
            if (this.verArr[i].getVertexe().equals(arr[1])) {
                arrInt[1] = i;
                break;
            }
        }
        return arrInt;
    }

    public void show() {
        for (VertexeType v : verArr) {
            if (v.getAdg() == null) {
                System.out.println(v);
                continue;
            }
            AdgvexType temp = v.getAdg();
            String s = v + "-->" + temp;
            while (true) {
                if (temp.getAdg() != null) {
                    temp = temp.getAdg();
                    s +="-->"+ temp;
                } else {
                    System.out.println(s);
                    break;
                }
            }
        }
    }

}

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

无向邻接表可以用一个数组来表示,数组的每个元素代表中的一个节点,每个节点包含一个链表,链表中存储了该节点连接的所有节点以及对应的边权重。以下是无向邻接表的示例代码: ```C++ #include <iostream> #include <list> using namespace std; // 邻接表节点 struct AdjListNode { int dest; // 目标节点的索引 int weight; // 边的权重 struct AdjListNode* next; // 指向下一个节点的指针 }; // 中的节点 struct GraphNode { list<AdjListNode*> adjList; // 相邻节点列表 }; // class Graph { private: int V; // 节点的数量 GraphNode* nodes; // 节点数组 public: Graph(int V) { this->V = V; nodes = new GraphNode[V]; } // 添加边 void addEdge(int src, int dest, int weight) { // 添加src到dest的边 AdjListNode* node1 = new AdjListNode; node1->dest = dest; node1->weight = weight; node1->next = nullptr; nodes[src].adjList.push_back(node1); // 添加dest到src的边 AdjListNode* node2 = new AdjListNode; node2->dest = src; node2->weight = weight; node2->next = nullptr; nodes[dest].adjList.push_back(node2); } // 打印邻接表 void printAdjList() { for (int i = 0; i < V; i++) { cout << "Node " << i << ": "; for (AdjListNode* node : nodes[i].adjList) { cout << "(" << node->dest << ", " << node->weight << ") "; } cout << endl; } } }; int main() { Graph g(4); g.addEdge(0, 1, 10); g.addEdge(0, 2, 20); g.addEdge(1, 2, 30); g.addEdge(2, 3, 40); g.printAdjList(); return 0; } ``` 运行结果: ``` Node 0: (1, 10) (2, 20) Node 1: (0, 10) (2, 30) Node 2: (0, 20) (1, 30) (3, 40) Node 3: (2, 40) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值