【数据结构与算法】图的基本结构介绍 邻接表与邻接矩阵编码实战_数据结构图的定义,邻接矩阵,邻接表代码实现

40 阅读2分钟
private static int V;
//边
private static int E;
//邻接矩阵
private static int[][] adj;
//存放边的信息
private int[][] edges;
//从文件中读取图的相关信息
public AdjMartix()  {

    edges = new int[][]{{7,7},{0,1},{0,2},{1,3},{2,3},{3,5},{3,6},{4,5}};
    V=edges[0][0];  //7
    E=edges[0][1];  //7
    adj=new int[V][E];
    for(int i=1;i<=V;i++){
        int a=edges[i][0];
        int b=edges[i][1];
        adj[a][b]=1;
        adj[b][a]=1;
    }

}

//返回 V E的方法 定义成public 上面定义成private是为了不让用户可以修改
public int V(){
    return V;
}
public int E(){
    return E;
}

//图中是否存在某条边
public boolean hasEdge(int v,int w){
    return adj[v][w]==1;
}

//返回顶点v相邻的边 找到顶点v相邻的点就等于找到了相邻的边 返回和V相邻的顶点
public ArrayList<Integer> adj(int v){
    //验证v是否合法
    validateVertex(v);
    //这里的逻辑可以对比对应的邻接矩阵
    //v是顶点 在矩阵中只要找到v那一行对应的哪一列是1 就代表有连线是相邻的边 adj[v][j]
    ArrayList<Integer> array = new ArrayList<>();
        for(int j=0;j<V;j++){
            if(adj[v][j]==1){
                array.add(j);
            }
        }
        System.out.println(array);
        return array;
}

// 度:顶点有多少个临边 求顶点的度
public int degree(int v){
    //直接调用上面的方法看对应有几条边度就是多少了
    return adj(v).size();
}

//判断参数是否合法
//invail 无效的
private void validateVertex(int v){
    if(v<0||v>=V){
        throw new IllegalArgumentException(v+"is invalid");
    }
}

private static void showAdj(){
    System.out.printf("V=%d E=%d \n",V,E);
    for(int i=0;i<V;i++){
        for(int j=0;j<V;j++){
            System.out.printf("%d ",adj[i][j]);
        }
        System.out.println();
    }
}


public static void main(String[] args)  {
    AdjMartix adjMartix = new AdjMartix();
    adjMartix.showAdj();
    adjMartix.adj(3);

}

}


运行结果:  
 ![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fff52c8fee3b47f3a04dd54e3583f6a3~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771406992&x-signature=WmiArltMq0ll3F6vZa1z6S%2B26w0%3D)  
 **邻接表**


* **邻接表它主要就是关心的是存在的边,不存在的边则不管,因此的话不会有空间上的浪费,邻接表=数组+链表。**  
 ![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7983099dbd904b20afb5351927baaa43~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771406992&x-signature=CQnA6WKA4EqfRLmQIukMJKfZPN0%3D)



public class GraphXIAOCHAN { //顶点 private static int V; //边 private static int E; //邻接表 链表数组 TreeSet低层使用的就是红黑树实现 private static TreeSet[] adj; //从文件中读取图的相关信息 //存放边的信息 private int[][] edges; public GraphXIAOCHAN() { edges = new int[][]{{7,7},{0,1},{0,2},{1,3},{2,3},{3,5},{3,6},{4,5}}; V=edges[0][0]; //7 E=edges[0][1]; //7 adj=new TreeSet[V]; for(int i=0;i<V;i++){ //遍历数组中的每一个元素 每个元素都开一个空间 adj[i]=new TreeSet();

    }
    for(int i=1;i<=V;i++){
        int a=edges[i][0];
        int b=edges[i][1];
        adj[a].add(b);
        adj[b].add(a);
    }

}

//返回 V E的方法 定义成public 上面定义成private是为了不让用户可以修改
public int V(){
    return V;
}
public int E(){
    return E;
}

//图中是否存在某条边
public boolean hasEdge(int v,int w){
    return adj[v].contains(w);
}

//返回顶点v相邻的边 找到顶点v相邻的点就等于找到了相邻的边 返回和V相邻的顶点
//这里进行修改 返回一个迭代器的方式 向用户隐藏低层的实现
public Iterable<Integer> adj(int v){
    return adj[v];
}

// 度:顶点有多少个临边 求顶点的度
public int degree(int v){
    //直接调用上面的方法看对应有几条边度就是多少了
    return adj[v].size();
}

//判断参数是否合法
//invail 无效的
private void validateVertex(int v){
    if(v<0||v>=V){
        throw new IllegalArgumentException(v+"is invalid");
    }
}

private static void showAdj(){
    System.out.printf("V=%d E=%d \n",V,E);
    for(int i=0;i<V;i++){
        System.out.printf("顶点%d: ",i);
        for(int w:adj[i]){
            System.out.printf("%d ",(w));
        }
        System.out.println();

    }
}

public static void main(String[] args) throws FileNotFoundException {
    GraphXIAOCHAN adjset = new GraphXIAOCHAN();
    adjset.showAdj();
}

}


运行结果  
 ![在这里插入图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/eaa885939f05441dacdd76d0f6ec53fb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771406992&x-signature=DTJrBOF58MOe89kjF40DH2wSC4M%3D)



### 最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~  

给大家准备的学习资料包括但不限于:  

Python 环境、pycharm编辑器/永久激活/翻译插件  

python 零基础视频教程  

Python 界面开发实战教程  

Python 爬虫实战教程  

Python 数据分析实战教程  

python 游戏开发实战教程  

Python 电子书100本  

Python 学习路线规划

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/629c647c9ed74522a10ab5449d1830b0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771406992&x-signature=xlqrhhFOxhzUITX4x0nW1LpsENs%3D)





**了解详情:https://docs.qq.com/doc/DSnl3ZGlhT1RDaVhV**