大家都還記得之前的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";
		}
	}