1. 程式人生 > >20162304 2017-2018-1 實驗四-圖的實現與應用

20162304 2017-2018-1 實驗四-圖的實現與應用

連線 寫實 int 鏈式 http 同時 lis 遇到 初始化

實驗四-圖的實現與應用

實驗四 圖的實現與應用-1

試驗內容

用鄰接矩陣實現無向圖(邊和頂點都要保存),實現在包含添加和刪除結點的方法,添加和刪除邊的方法,size(),isEmpty(),廣度優先叠代器,深度優先叠代器
給出偽代碼,產品代碼,測試代碼(不少於5條測試)

實驗結果

技術分享圖片

  1. 要想用鄰接矩陣實現圖,首先需要使用一個一維數組存放頂點,一個二維數組存放邊;
  2. 然後清楚兩個頂點之間的關系如何表示,用鄰接矩陣表示出來是什麽樣的;
  • 其中值得註意的是對角線上的應該是0,因為自己和自己是沒有路徑的。
    技術分享圖片

    廣度優先遍歷

設立一個訪問標誌數組visited[N],初值為0,某頂點被訪問後,則相應下標元素置1。
(1)初始化隊列Q;visited[N]=0;
(2)訪問頂點v;visited[v]=1;頂點v入隊列Q;
(3) while(隊列Q非空)   
              v = 隊列Q的隊頭元素出隊;
              w = 頂點v的第一個鄰接點;
              while ( w存在 )
                     如果w未訪問,則訪問頂點w;
                     visited[w]=1;
                     頂點w入隊列Q;
                     w=頂點v的下一個鄰接點

深度優先遍歷

設立一個訪問標誌數組visited[N],初值為0,某點被訪問,則相應下標變量置1。
輸入要訪問的結點V1;
訪問結點V1,visited[vi]=1;
在鄰接矩陣第i行中進行查找,若vi有鄰接點vj沒有被訪問,則設置vi=vj;
重復前幾步直到所有結點均被訪問;

實驗四 圖的實現與應用-2

實驗內容

用十字鏈表實現無向圖(邊和頂點都要保存),實現在包含添加和刪除結點的方法,添加和刪除邊的方法,size(),isEmpty(),廣度優先叠代器,深度優先叠代器
給出偽代碼,產品代碼,測試代碼(不少於5條測試)

實驗結果

  • 十字鏈表的概念:十字鏈表(Orthogonal List)是有向圖的另一種鏈式存儲結構。該結構可以看成是將有向圖的鄰接表和逆鄰接表結合起來得到的。用十字鏈表來存儲有向圖,可以達到高效的存取效果。同時,代碼的可讀性也會得到提升。
    技術分享圖片

在這個實驗中我們說一下具體方法的實現

1.add()

這個方法的話,我直接讓數組的下一個位置等於我們輸入的那個元素;
2.isEmpty()

在這裏只需要判斷我們用於儲存結點的數組是否為空即可。
3.size()

返回用於計數的 anInt;
4.remove()

這個方法在十字鏈表這塊兒我到目前為止還沒能實現,希望可以通過繼續的學習實現。

技術分享圖片

實驗四 圖的實現與應用-3

實驗內容

實現PP19.9
給出偽代碼,產品代碼,測試代碼(不少於5條測試)

實驗結果

PP19.9,只需要調用前面我們實現的樹的遍歷,然後在其中加入判斷如何判別最短路徑的方法即可,
判斷最短路徑的方法:

開始假定直達路徑即為我們需要的最短路徑
初始時v0屬於visited,即已經找到v0 到v的最短路徑
來假設經由一個點中轉到達其余各點,會近些並驗證
直到我們窮舉完
挑一個距離最近經由點,下標裝入 v
經由頂點j中轉則距離更短
頂點v並入S,由v0到達v頂點的最短路徑為min.
假定由v0到v,再由v直達其余各點,更新當前最後一個經由點及距離
如果多經由一個v點到達j點的 最短路徑反而要短,就更新

技術分享圖片

實驗中遇到的問題

1.實驗中遇到的一個比較突出的問題就是,在我寫實驗1測試類的時候遇到了死循環
技術分享圖片
解決過程:經過反復嘗試我發現是在添加數據進去的時候沒有正確的改變數組的大小從而導致死循環
2.實驗3實現的過程中出現了空指針的問題
技術分享圖片
這個問題,在求助楊京典同學後,我們發現,我是沒有先將點加到數組中,就先開始在兩點之間建立連線了,將順序換一下,就改好啦

實驗感悟

這次實驗給我的收獲比較大,遇到了一些以前沒有主要到的問題,老師也及時為我指出了我的不足,我會在以後註意這些問題的。

20162304 2017-2018-1 實驗四-圖的實現與應用