20162303 實驗四 圖的應用與實現

北京電子科技學院(BESTI)

實 驗 報 告

課程:程序設計與數據結構
班級: 1623
姓名: 石亞鑫
學號:20162303javascript

成績: 2分
指導教師:婁嘉鵬 王志強
實驗日期:11月20日java

實驗密級: 非密級
預習程度: 已預習
實驗時間:15:25-17:15數組

必修/選修: 必修
實驗序號: cs_03網絡

實驗內容

實驗一

  • 用鄰接矩陣實現無向圖(邊和頂點都要保存),實如今包含添加和刪除結點的方法,添加和刪除邊的方法,size(),isEmpty(),廣度優先迭代器,深度優先迭代器
  • 給出僞代碼,產品代碼,測試代碼(很多於5條測試)
  • 上方提交代碼連接
  • 附件提交測試截圖

實驗二

  • 用十字鏈表實現無向圖(邊和頂點都要保存),實如今包含添加和刪除結點的方法,添加和刪除邊的方法,size(),isEmpty(),廣度優先迭代器,深度優先迭代器
  • 給出僞代碼,產品代碼,測試代碼(很多於5條測試)
  • 上方提交代碼連接
  • 附件提交測試截圖

實驗三

  • 實現PP19.9
  • 給出僞代碼,產品代碼,測試代碼(很多於5條測試)
  • 上方提交代碼連接
  • 附件提交測試截圖

實驗步驟

(1) 實驗一

鄰接矩陣
邏輯結構分爲兩部分:V和E集合。所以,用一個一維數組存放圖中全部頂點數據;用一個二維數組存放頂點間關係(邊或弧)的數據,這個二維數組稱爲鄰接矩陣。

代碼
  • 添加和刪除結點的方法,添加和刪除邊的方法
//添加結點
    public void insertVertex(Object vertex) {
        vertexList.add(vertexList.size(),vertex);
    }

   //添加邊
    public void insertEdge(int v1,int v2,int weight) {
        edges[v1][v2]=weight;
        numOfEdges++;
    }

    //刪除結點
    public void deleteEdge(int v1,int v2) {
        edges[v1][v2]=0;
        numOfEdges--;
    }
  • size(),isEmpty()
//獲得頂點的數目
    public int getVertsCount() {
        return nVerts;
    }

    //獲得邊的數目
    public int getNumOfEdges() {
        return nVerts;
    }
    public boolean isEmpty()
    {
        if ( vertexList.size()== 0)
            return  true;
        else
            return false;
    }
  • 廣度優先迭代器,深度優先迭代器
//私有函數,深度優先遍歷
    private void depthFirstSearch(boolean[] isVisited,int  i) {
        //首先訪問該結點,在控制檯打印出來
        System.out.print(getValueByIndex(i)+"  ");
        //置該結點爲已訪問
        isVisited[i]=true;

        int w=getFirstNeighbor(i);//
        while (w!=-1) {
            if (!isVisited[w]) {
                depthFirstSearch(isVisited,w);
            }
            w=getNextNeighbor(i, w);
        }

    }

    //私有函數,廣度優先遍歷
    private void broadFirstSearch(boolean[] isVisited,int i) {
        int u,w;
        LinkedList queue=new LinkedList();

        //訪問結點i
        System.out.print(getValueByIndex(i)+"  ");
        isVisited[i]=true;
        //結點入隊列
        queue.addLast(i);
        while (!queue.isEmpty()) {
            u=((Integer)queue.removeFirst()).intValue();
            w=getFirstNeighbor(u);
            while(w!=-1) {
                if(!isVisited[w]) {
                    //訪問該結點
                    System.out.print(getValueByIndex(w)+"  ");
                    //標記已被訪問
                    isVisited[w]=true;
                    //入隊列
                    queue.addLast(w);
                }
                //尋找下一個鄰接結點
                w=getNextNeighbor(u, w);
            }
        }
實現

(2) 實驗二

十字鏈表
鄰接表,存儲方法跟樹的孩子鏈表示法相相似,是一種順序分配和鏈式分配相結合的存儲結構。如這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向鏈表中。

代碼
  • 添加和刪除結點的方法,添加和刪除邊的方法
//添加結點
    public void addVertex(Vertex vertex) {
        vertex.setIndex(nVerts);
        vertexList.add(vertex);
        nVerts++;
    }
   //添加邊
    public void addEdge(int start, int end) {
        vertexList.get(start).addAdj(vertexList.get(end));
        if (!isDirected) {
            vertexList.get(end).addAdj(vertexList.get(start));
        }
    }
    //刪除邊
    public void deleteEdge(int start, int end) {
        vertexList.get(start).addAdj(vertexList.get(end));
        if (!isDirected) {
            vertexList.get(end).addAdj(vertexList.get(start));
    }}
  • size(),isEmpty()
//獲得頂點的個數
    public int getNumOfVertex() {
        return vertexList.size();
    }

    //獲得邊的數目
    public int getNumOfEdges() {
        return numOfEdges;
    }
    public boolean isEmpty()
    {
        if ( numOfEdges== 0)
            return  true;
        else
            return false;
    }
  • 廣度優先迭代器,深度優先迭代器
// 深度優先遍歷
    public void dfs() {
        theStack = new StackX(nVerts);
        vertexList.get(0).wasVisted = true;
        dfs.add(vertexList.get(0));
        theStack.push(vertexList.get(0));
        Vertex vertex;
        while (!theStack.isEmpty()) {
            vertex = getAdjVertex((Vertex) theStack.peek());
            if (vertex == null) {
                theStack.pop();
            } else {
                vertex.wasVisted = true;
                dfs.add(vertex);
                theStack.push(vertex);
            }
        }
    }

    // 廣度優先遍歷
    public void bfs() {
        theQueue = new Queue(nVerts);
        vertexList.get(0).wasVisted = true;
        bfs.add(vertexList.get(0));
        theQueue.insert(vertexList.get(0));
        Vertex vertex1;
        while (!theQueue.isEmpty()) {
            Vertex vertex2 = (Vertex) theQueue.remove();
            while ((vertex1 = getAdjVertex(vertex2)) != null) {
                vertex1.wasVisted = true;
                bfs.add(vertex1);
                theQueue.insert(vertex1);
            }
        }
}
截圖

(3) 實驗三

建立計算機網絡路由系統
輸入網路中點到點的線路
以及每條線路使用的費用
系統輸出網絡中各點之間最便宜的路徑
指出不相同的全部位置

根據個人見解,就是求出有權圖的最短路徑。數據結構

實現

統計本身的PSP(Personal Software Process)時間

步驟 耗時 百分比
需求分析 60min 13.6%
代碼實現 300min 68.1%
測試 60min 13.6%
分析總結 20min 4.5%
相關文章
相關標籤/搜索