20162328蔡文琛 实验四 图的实现与应用

20162328蔡文琛 大二 实验四

任务详情

实验1

用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器

实现类
public class MatrixUDG {

    private char[] mVexs;       // 顶点集合
    private int[][] mMatrix;    // 邻接矩阵

    /*
     * 创建图(自己输入数据)
     */
    public boolean isEmpty(){
        boolean result = true;
        if (mVexs.equals(0) )
            return result = false;
        return result;
    }
    public void size(){
        int num= 0;
        num = mVexs.length;
        System.out.println(num);
    }
    public MatrixUDG(char[] vexs, char[][] edges) {

        // 初始化"顶点数"和"边数"
        int vlen = vexs.length;
        int elen = edges.length;

        // 初始化"顶点"
        mVexs = new char[vlen];
        for (int i = 0; i < mVexs.length; i++)
            mVexs[i] = vexs[i];

        // 初始化"边"
        mMatrix = new int[vlen][vlen];
        for (int i = 0; i < elen; i++) {
            // 读取边的起始顶点和结束顶点
            int p1 = getPosition(edges[i][0]);
            int p2 = getPosition(edges[i][1]);

            mMatrix[p1][p2] = 1;
            mMatrix[p2][p1] = 1;
        }
    }

    /*
     * 返回ch位置
     */
    private int getPosition(char ch) {
        for (int i = 0; i < mVexs.length; i++)
            if (mVexs[i] == ch)
                return i;
        return -1;
    }

    /*
     * 读取一个输入字符
     */
    private char readChar() {
        char ch = ‘0‘;

        do {
            try {
                ch = (char) System.in.read();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } while (!((ch >= ‘a‘ && ch <= ‘z‘) || (ch >= ‘A‘ && ch <= ‘Z‘)));

        return ch;
    }

    /*
     * 读取一个输入字符
     */
    private int readInt() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }

    /*
     * 打印矩阵队列图
     */
    public void print() {
        System.out.printf("Martix Graph:\n");
        for (int i = 0; i < mVexs.length; i++) {
            for (int j = 0; j < mVexs.length; j++)
                System.out.printf("%d ", mMatrix[i][j]);
            System.out.printf("\n");
        }
    }
}

实验2

用十字链表实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器

public class Main {
    public static class Vertex<E,T>  {
        E data;
        Edge<T> firstIn;
        Edge<T> firstOut;

        public Vertex(E data) {
            this.data = data;
        }
    }
    public static class Edge<E> {
        E data;
        int fromVertexIndex;
        int toVertexIndex;
        Edge<E> nextSameFromVertex;
        Edge<E> nextSameToVertex;

        public Edge(E data, int fromVertexIndex, int toVertexIndex) {
            this.data = data;
            this.fromVertexIndex = fromVertexIndex;
            this.toVertexIndex = toVertexIndex;
        }
    }
    public static void insertEdge(Edge<Integer> edge, List<Vertex<Integer, Integer>> vertexList) {
        int fromVertexIndex = edge.fromVertexIndex;
        int toVertexIndex = edge.toVertexIndex;
        Vertex<Integer, Integer> fromVertex = vertexList.get(fromVertexIndex);
        Vertex<Integer, Integer> toVertex = vertexList.get(toVertexIndex);

        if (fromVertex.firstOut == null) {
            //插入到顶点的出边属性
            fromVertex.firstOut = edge;
        } else {
            // 插入到edge的nextSameFromVertex属性
            Edge<Integer> tempEdge = fromVertex.firstOut;
            //找到最后一个Edge
            while (tempEdge.nextSameFromVertex != null) {
                tempEdge = tempEdge.nextSameFromVertex;
            }
            tempEdge.nextSameFromVertex = edge;
        }
        if (toVertex.firstIn == null) {
            //插入到顶点的入边属性
            toVertex.firstIn = edge;
        } else {
            // 插入到edge的nextSameToVertex属性
            Edge<Integer> tempEdge = toVertex.firstIn;
            //找到最后一个Edge
            while (tempEdge.nextSameToVertex != null) {
                tempEdge = tempEdge.nextSameToVertex;
            }
            tempEdge.nextSameToVertex = edge;
        }
    }
    public static void printVertexAndEdges(List<Vertex<Integer, Integer>> list) {
        for (Vertex<Integer, Integer> vertex : list) {
            //输出入度
            String infoIn = String.format("vertex: %3d - its in-edge are: ", vertex.data);
            Edge<Integer> edge = vertex.firstIn;
            while (edge != null) {
                infoIn += String.format("(from: %d, to: %d, data: %d)", edge.fromVertexIndex, edge.toVertexIndex, edge.data);
                edge = edge.nextSameToVertex;
            }
            System.out.println(infoIn);
            //输出出度
            String infoOut = String.format("vertex: %3d - its out-edge are: ", vertex.data);
            Edge<Integer> edgeOut = vertex.firstOut;
            while (edgeOut != null) {
                infoOut += String.format("(from: %d, to: %d, data: %d)", edgeOut.fromVertexIndex, edgeOut.toVertexIndex, edgeOut.data);
                edgeOut = edgeOut.nextSameFromVertex;
            }
            System.out.println(infoOut);
        }
    }
    public static void main(String[] args) {
        int vertexNumber = 12;
        int edgeNumber = 21;
        // 检查边的数量是否正确
        // 有向完全图
        int maxEdgeNumber = vertexNumber*(vertexNumber-1);
        if (edgeNumber < 0 || edgeNumber > maxEdgeNumber) {
            return;
        }
        // 输入有向图数据
        // 1. 先输入顶点,暂时令firstIn, firstOut为null;
        ArrayList<Vertex<Integer, Integer>> vertexList = new ArrayList<>();
        for (int i=0; i<vertexNumber; i++) {
            Vertex<Integer, Integer> v = new Vertex<>(i);
            vertexList.add(v);
        }

实验3

实现PP19.9

public class Router {
        public int id;
         public List<Table> tableList;

        public Router(){
        tableList=new ArrayList<Table>();
        }
        public void printTable(){
        System.out.println("------------routTable of No "+id+"router is------------------");
        for (Table table : tableList) {
        System.out.println(table.hostId+" "+table.netId+"  "+table.distance+"  "+table.nextJumpId);
        }
       }
        public boolean isNearby(Router router){
         List<Table> tablesOther= router.tableList;
        for (Table table : tablesOther) {
       for (Table table2 : tableList) {
        if ((table.netId==table2.netId)&&(table.distance==1)&&(table2.distance==1)&&(table.hostId!=table2.hostId)) {
        return true;//判断相邻的条件:两个路由器,对于相同的网络,都直接相连(距离为1)  
        }
        }
        }
        return false;
        }
        public void init(int[][]near){//初始化问题:输入邻接矩阵,对每一个路由器,循环感知相连的网络  
        tableList=new ArrayList<Table>();
        for (int i=0;i< near[id].length;i++)//对矩阵的第id行做循环,注意net编号是从0开始的  
        {
        if (near[id][i]==1) {//id路由器和i号网络相连  
         Table temptTable=new Table();
        temptTable.hostId=id;
        temptTable.netId=i;
        temptTable.distance=1;
        temptTable.nextJumpId=-1;//下一跳id为-1,表示直接交付  
        tableList.add(temptTable);
        }
        }
        }
        public void send(Router router){//向指定路由器发送table,假设已知道二者相连  
       router.update(tableList);//直接让对方更新自己的表就行了  
        }
        public void update(List <Table> newList){
        java.util.Iterator<Table > iterator1= newList.iterator();
        while(iterator1.hasNext()) {//对于对方每一项,检查自己所有项  
        Table table1= iterator1.next();//取出对方项  
        List<Table>tempTableList=new ArrayList<Table>();//临时表,存储新增的项目  
       int flag=0;//标志变量,记录是否找到相同目的地址的项  
        java.util.Iterator<Table> iterator2=tableList.iterator();
      while (iterator2.hasNext()) {
        Table table2 = (Table) iterator2.next();//  
       if (table2.netId==table1.netId) {
        flag=1;
  if (table2.nextJumpId==table1.hostId) {
      table2.distance=table1.distance+1;
 }
else {
if (table2.distance>table1.distance+1) {
table2.nextJumpId=table1.hostId;
table2.distance=table1.distance+1;
}
}
}
}
if (flag==0){
flag=1;
     Table tempTable=new Table();
     tempTable.hostId=id;
  tempTable.netId=table1.netId;
   tempTable.nextJumpId=table1.hostId;
tempTable.distance=table1.distance+1;

tableList.add(tempTable);
}

}
printTable();
}
        }

遍历类

public class Graph {
    private boolean[] flag;

        static String[] vertexs;

         int[][] edges;

        public void DFSTraverse(int num1) {
        flag = new boolean[num1];
        for (int i = 0; i < num1; i++) {
       if (flag[i] == false) {// 当前顶点没有被访问
        DFS(i);
        }
        }
        }

       public void DFS(int i) {
        flag[i] = true;// 第i个顶点被访问
        System.out.print(vertexs[i] + " ");
     for (int j = 0; j < flag.length; j++) {
        if (flag[j] == false && edges[i][j] == 1) {
        DFS(j);
        }
        }
        }

       public ArrayList<String> BFSTraverse(int[][] ints, String[] m, int num) {
        flag = new boolean[num];
        ArrayList<String> result = new ArrayList<>();
        LinkedList<Integer> queue = new LinkedList<Integer>();
        flag[0] = true;
        queue.add(0);
        while (!queue.isEmpty()) {
        int j = queue.remove(0);
        result.add(m[j]);
        for (int k = 0; k < num; k++) {
        if (ints[j][k] == 1 && flag[k] == false) {
        flag[k] = true;
        queue.add(k);
        }
        }
        }
        return result;
        }

代码参考http://blog.csdn.net/coslay/article/details/47748089

http://www.sharejs.com/codes/java/6692

http://blog.csdn.net/caib1109/article/details/72777806

时间: 2024-10-10 06:11:22

20162328蔡文琛 实验四 图的实现与应用的相关文章

20162328蔡文琛 实验五 数据结构综合应用

实验五:数据结构综合应用 课程:程序设计与数据结构 班级: 1623 姓名: 蔡文琛 学号:20162328 指导教师:娄嘉鹏 王志强 实验日期:12月15日 实验密级: 非密级 预习程度: 已预习 必修/选修: 必修 实验名称: 数据结构综合应用 实验内容: 1.分析系统架构 2.编译.运行.测试系统 3.修改系统 4.分析数据结构.排序.查找算法的应用 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验报告,

20162328蔡文琛 第二学期课程总结

学号20162328 2016-2017-2<程序设计与数据结构>课程总结 每周作业链接汇总 第一周作业 算法+程序机构=程序 渐进复杂度称为算法的阶. 算法分析是计算机科学的基础课题 第三周作业 查找是在一组项内找到指定目标或是确定目标不存在的过程. 搞高效的查找使得比较的次数最少. Comparable接口允许许多动态实现算法,而不是指应用于特定的类. 二分查找的每次比较都排除了一半的可行候选数据. 排序是按某种标准将一列数据项按确定的次序重排的过程. 教材学习内容总结 教材学习中的问题和

20162328蔡文琛 week11 大二

20162328 2017-2018-1 <程序设计与数据结构>第十一周学习总结 教材学习内容总结 在无向图中,表示边的顶点对是无序的. 如果图中的两个顶点之间有边链接,则称它们是领接的. 如果无向图中连接顶点的边数达到最大,则称为完全图. 路径是图中连接两个顶点的边的序列. 第一个顶点和最后一个顶点相图且边不重复的路径称为环. 在有向图中,边是顶点的有序对. 有向图中的路径是连接图中两个顶点的有向边的序列. 图的每条边上都有对应的权值的图称为带权图. 图的深度优先遍历与广度优先遍历的主要差异

数据结构实验报告-实验四 图的构造与遍历

实验四   图的构造与遍历   l  实验目的 1.图的的定义和遍历 (1)掌握图的邻接矩阵.邻接表的表示方法. (2)掌握建立图的邻接矩阵的算法. (3)掌握建立图的邻接表的算法. (4)加深对图的理解,逐步培养解决实际问题的能力. l  实验内容 1.图的定义和遍历 (一)基础题 1.编写图基本操作函数: (1)CreateALGraph(ALGraph &G) 建立无向图的邻接表表示: (2)LocateVex(ALGraph &G,char v)图查找信息: (3)DFSTrave

实验四 图的实现和应用 实验报告 20162305

实验四 图的实现和应用 实验报告 20162305 实验一 邻接矩阵实现无向图 实验要求 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器.给出伪代码,产品代码,测试代码(不少于5条测试) 实验过程 用邻接矩阵表示无向图,首先我们先明确什么是邻接矩阵.邻接矩阵就是用矩阵的方式来表示不同结点之间的关系,对于无向图来说,如果结点(i,j)之间有联系,则在矩阵中(i,j)所对应的的点的值为1,

20162313 苑洪铭 实验四 图的实现与应用

20162313 苑洪铭 实验四 图的实现与应用 实验1 要求 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器 给出伪代码,产品代码,测试代码(不少于5条测试) 内容 邻接矩阵(Adjacency Matrix):是表示顶点之间相邻关系的矩阵.设G=(V,E)是一个图,其中V={v1,v2,-,vn}. 对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零,副对角线不一定为0. 总

20162304 2017-2018-1 实验四-图的实现与应用

实验四-图的实现与应用 实验四 图的实现与应用-1 试验内容 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器 给出伪代码,产品代码,测试代码(不少于5条测试) 实验结果 要想用邻接矩阵实现图,首先需要使用一个一维数组存放顶点,一个二维数组存放边: 然后清楚两个顶点之间的关系如何表示,用邻接矩阵表示出来是什么样的: 其中值得注意的是对角线上的应该是0,因为自己和自己是没有路径的. 广度优

2017-2018-1 20162330 实验四 图的实现与应用

课程名称:<程序设计与数据结构> 学生班级:1623班 学生姓名:刘伟康 学生学号:20162330 实验时间:2017年11月20日-2017年11月24日 实验名称:图的实现与应用 指导老师:娄嘉鹏.王志强老师 目录 实验要求 实验步骤及代码实现 代码托管汇总 图的实现与应用-1:用邻接矩阵实现无向图 图的实现与应用-2:用十字链表实现有向图 图的实现与应用-3:实现PP19.9 测试过程及遇到的问题 1. 第一个实验无向图的边输入错误 分析总结及PSP时间统计 参考资料 实验要求: 实验

20162327WJH实验四——图的实现与应用

20162327WJH实验四--图的实现与应用 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验日期:11月20日 实验密级: 非密级 预习程度: 已预习 实验时间:15:25-17:15 必修/选修: 必修 实验序号: cs_23 实验内容 实验一 1.实验内容 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,