大家都還記得之前的adjacency list吧!這個練習題結合了adjacency list 與 pointer 的概念,我認為是一個很好的練習,不過又不會太複雜,畢竟 pointer 對我來說還是一個非常似是而非的觀念。
我們今天要製作 adjacency list 的方法是:
如下圖:
Sol
按照以下的程式碼,我們的結果可以符合下方輸入輸出格式:NODE_CNT_MAX
:最多有多少 nodes。nodeCnt
:nodes 總數。degrees
:有多少 nodes 與目前的 node 相鄰。neighbors
:與之相鄰的 nodes。
inputGraphInfo
:將輸入進去的資料分別存入陣列中。printGraph
:將每個 node 各自的鄰居輸出。releaseMemory
:由於動態陣列不會自己刪除其記憶體,我們需要寫 delete statments
接下來,我們來運用上面的程式碼來做延伸,
若輸出輸入格式要符合以下:
例如:
不直接印出與其相鄰的 nodes,而是只要相鄰的話就存成 1,若與這個 node 不相鄰就存成 0,並將整個 neighbors 陣列都印出來。
Sol
這邊我只對printGraph
這個函數作改變,新增一個二維陣列adjacencyMatrix
,其長度為nodeCnt
,並將其各項初始化為v0,接下來運用 for 迴圈判斷,只要有相鄰的點就改為 1。
Pseudocode
printGraph:
// 建adjacencyMatrix,並將其各項皆初始化為0
for i in range 0 ~ nodeCnt {
for j in range 0 ~ degrees[i] {
if (0 <= neighbors[i][j] < nodeCnt) {
adjacencyMatrix[i][neighbors[i][j]] = 1;
}
}
}
// 按題目要求輸出
for i in range 0 ~ nodeCnt {
for j in range 0 ~ nodeCnt {
if (j == nodeCnt - 1) {
cout << adjacencyMatrix[i][j];
}
else {
cout << adjacencyMatrix[i][j] << " ";
}
}
if (i != nodeCnt - 1) {
cout << "\n";
}
}