数据结构:图的存储的实现(邻接矩阵,邻接表)

邻接矩阵

 

 

 

 

 

 

public interface Graph<V> {

    int numOfVertex();//返回顶点的个数

    int numOfEdge();//返回边的个数

    void addVertex(V v);//增加一个顶点

    void addEdge(V from, V to);//增加一条边

    void addEdge(V from, V to, int weight);//增加一条带权值的边

    void removeVertex(V v);//删除一个顶点

    void removeEdge(V from, V to);//删除一条边

    void displayGraph();//显示一个图

    int degree(V v);//返回顶点v的度

}


//无向图的邻接矩阵存储
public class UndirectedMatrixGraph<V> implements Graph<V> {
    private ArrayList<V> vertexList;//存储顶点的集合
    private int[][] edgeMatrix;//存储边的邻接矩阵
    private int numOfVertex;//顶点的个数
    private int numOfEdge;//边的个数
    private int size;//顶点的最大规模
    private boolean[] isVisited;//记录顶点是否被访问

    public UndirectedMatrixGraph() {
    }

    public UndirectedMatrixGraph(int size) {
        this.size = size;
        vertexList = new ArrayList<V>(size);
        edgeMatrix = new int[size][size];
        numOfVertex = 0;
        numOfEdge = 0;
        isVisited = new boolean[numOfVertex];
    }

    @Override
    public int numOfVertex() {
        return this.numOfVertex;
    }

    @Override
    public int numOfEdge() {
        return this.numOfEdge;
    }

    @Override
    public void addVertex(V v) {
        this.vertexList.add(v);
        numOfVertex++;
    }

    @Override
    public void addEdge(V from, V to) {
        addEdge(from, to, 1);
    }

    @Override
    public void addEdge(V from, V to, int weight) {
        int i = vertexList.indexOf(from);
        int j = vertexList.indexOf(to);
        edgeMatrix[i][j] = weight;
        edgeMatrix[j][i] = weight;
        numOfEdge++;
    }

    @Override
    public void removeVertex(V v) {
        int index = vertexList.indexOf(v);//找到顶点的索引
        //所有的行向前移动一行
        for (int i = index; i < numOfVertex - 1; i++) {//拿到index这一行,和后面的每一行
            for (int j = 0; j < numOfVertex; j++) {//遍历某一行的所有元素
                edgeMatrix[i][j] = edgeMatrix[i + 1][j];//把每个元素上移
            }
        }
        //所有的列向前移动一行
        for (int i = 0; i < numOfVertex; i++) {
            for (int j = index; j < numOfVertex - 1; j++) {
                edgeMatrix[i][j] = edgeMatrix[i][j + 1];
            }
        }
        vertexList.remove(index);//从顶点的集合中删除这个顶点
        numOfVertex--;//顶点的个数-1
        //遍历邻接矩阵,得到依赖该顶点的边的条数从而调整边的总数
        for (int i = 0; i < numOfVertex; i++) {
            if (edgeMatrix[index][i] != 0) {
                numOfEdge--;
            }
        }
    }

    @Override
    public void removeEdge(V from, V to) {
        int i = vertexList.indexOf(from);
        int j = vertexList.indexOf(to);
        edgeMatrix[i][j] = 0;
        edgeMatrix[j][i] = 0;
        numOfEdge--;
    }

    @Override
    public void displayGraph() {
        System.out.println("这是一个无向图(邻接矩阵)");
        System.out.println("这个图的顶点是:" + vertexList);
        System.out.println("这个图的邻接矩阵是:");
        for (int i = 0; i < numOfVertex; i++) {
            for (int j = 0; j < numOfVertex; j++) {
                System.out.print(edgeMatrix[i][j] + "\t");
            }
            System.out.println();
        }
    }

    @Override
    public int degree(V v) {
        int n = 0;
        int index = vertexList.indexOf(v);
        for (int i = 0; i < numOfVertex; i++) {
            if (edgeMatrix[index][i] != 0) {
                n++;
            }
        }
        return n;
    }
}


public class GraphDemo {
    public static void main(String[] args) {
        Graph graph = new UndirectedMatrixGraph<Character>(6);

        //添加顶点
        graph.addVertex('A');
        graph.addVertex('B');
        graph.addVertex('C');
        graph.addVertex('D');
        graph.addVertex('E');
        graph.addVertex('F');

        //添加边
        graph.addEdge('A', 'B');
        graph.addEdge('A', 'D');
        graph.addEdge('B', 'C');
        graph.addEdge('B', 'E');
        graph.addEdge('C', 'D');
        graph.addEdge('C', 'F');
        graph.addEdge('D', 'F');
        graph.addEdge('E', 'F');

        graph.displayGraph();
        System.out.println("图的顶点数为" + graph.numOfVertex());
        System.out.println("图的边数为" + graph.numOfEdge());

        //删除顶点
        graph.removeVertex('B');
        graph.displayGraph();
        System.out.println("图的顶点数为" + graph.numOfVertex());
        System.out.println("图的边数为" + graph.numOfEdge());
        System.out.println("节点C的度为" + graph.degree('C'));
    }
}

邻接表

 

 

 

public interface Graph<V> {

    int numOfVertex();//返回顶点的个数

    int numOfEdge();//返回边的个数

    void addVertex(V v);//增加一个顶点

    void addEdge(V from, V to);//增加一条边

    void addEdge(V from, V to, int weight);//增加一条带权值的边

    void removeVertex(V v);//删除一个顶点

    void removeEdge(V from, V to);//删除一条边

    void displayGraph();//显示一个图

    int degree(V v);//返回顶点v的度

}



//无向图的邻接表存储
public class UndirectedLinkGraph<V> implements Graph<V> {

    class Vertex<V> {//内部类,存储顶点的信息
        V date;//顶点值
        LinkedList<Integer> adj;//顶点的每一个邻接顶点构成的邻接表,Integer为顶点在顶点数组中的下标

        //顶点的构造方法
        Vertex(V date) {
            this.date = date;
            adj = new LinkedList<Integer>();
        }

        public V getDate() {
            return date;
        }

        public LinkedList<Integer> getAdj() {
            return adj;
        }
    }

    Vertex<V>[] vertexList;//由顶点组成的数组
    int numOfVertex;//顶点的数量
    int numOfEdge;//边的数量
    int size;//顶点的最大规模

    UndirectedLinkGraph() {

    }

    UndirectedLinkGraph(int size) {
        vertexList = new Vertex[size];
        numOfVertex = 0;
        numOfEdge = 0;
    }

    @Override
    public int numOfVertex() {
        return numOfVertex;
    }

    @Override
    public int numOfEdge() {
        return numOfEdge;
    }

    @Override
    public void addVertex(V v) {
        vertexList[numOfVertex] = new Vertex<V>(v);
        numOfVertex++;
    }

    @Override
    public void addEdge(V from, V to) {
        addEdge(from, to, 1);
    }

    @Override
    public void addEdge(V from, V to, int weight) {
        //传入的是一个Vertex对象的顶点值
        //根据顶点值找这个Vertex对象在数组中的索引
        int i = getIndex(from);
        int j = getIndex(to);
        vertexList[i].adj.add(j);
        vertexList[j].adj.add(i);
        numOfEdge++;

    }

    //根据顶点值找这个Vertex对象在数组中的索引
    public int getIndex(V v) {
        for (int i = 0; i < numOfVertex(); i++) {
            if (vertexList[i].date == v) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public void removeVertex(V v) {
        int index = getIndex(v);
        //更新边的总数
        numOfEdge = numOfEdge - degree(v);
        //更新顶点的个数
        numOfVertex--;
        //删除边
        for (int i : vertexList[index].adj) {//遍历删除的这个顶点的邻接表,获取每邻接顶点一个值
            vertexList[i].adj.remove(new Integer(index));//删除邻接顶点的邻接表中被删除顶点的值
        }
        //删除这个顶点
        for (int i = index; i < numOfVertex - 1; i++) {
            vertexList[i] = vertexList[i + 1];
        }
        //更新邻接表中存储的被删除顶点后面的顶点的下标
        for (int i = 0; i < numOfVertex; i++) {
            for (int j = 0; j < vertexList[i].adj.size(); j++) {
                LinkedList<Integer> list = vertexList[i].adj;
                if (list.get(j) > index) {
                    list.set(j, list.get(j) - 1);
                }
            }
        }
    }

    @Override
    public void removeEdge(V from, V to) {
        int i = getIndex(from);
        int j = getIndex(to);
        vertexList[i].adj.remove(new Integer(j));
        vertexList[j].adj.remove(new Integer(i));
        numOfEdge--;
    }

    @Override
    public void displayGraph() {
        System.out.println("这是一个邻接表存储的无向图");
        for (int i = 0; i < numOfVertex; i++) {
            System.out.print("顶点:" + vertexList[i].date + "\t");
            System.out.println("邻接表:" + vertexList[i].adj);
        }
    }

    @Override
    public int degree(V v) {
        int i = getIndex(v);
        return vertexList[i].adj.size();
    }
}


public class GraphDemo {
    public static void main(String[] args) {
        Graph graph = new UndirectedLinkGraph<Character>(6);//邻接表测试

        //添加顶点
        graph.addVertex('A');
        graph.addVertex('B');
        graph.addVertex('C');
        graph.addVertex('D');
        graph.addVertex('E');
        graph.addVertex('F');

        //添加边
        graph.addEdge('A', 'B');
        graph.addEdge('A', 'D');
        graph.addEdge('B', 'C');
        graph.addEdge('B', 'E');
        graph.addEdge('C', 'D');
        graph.addEdge('C', 'F');
        graph.addEdge('D', 'F');
        graph.addEdge('E', 'F');

        graph.displayGraph();
        System.out.println("图的顶点数为" + graph.numOfVertex());
        System.out.println("图的边数为" + graph.numOfEdge());

        //删除顶点
        graph.removeVertex('B');
        graph.displayGraph();
        System.out.println("图的顶点数为" + graph.numOfVertex());
        System.out.println("图的边数为" + graph.numOfEdge());
        System.out.println("顶点C的度为" + graph.degree('C'));
    }
}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值