簡介
假定採用一個數組node,該數組的每個元素中都包含兩個域:data和link。數組中的節點分別是:node[0]、node[l]、...、node[Number Of Nodes-l]。以下用節點i來代表node[i]。如果一個單向鍊表c由節點10,5和24按序構成,將得到c=10(指向鍊表c的第一個節點的指針是整數類型),node[10].link=5(指向第二個節點的指針),node[5].link=24(指向下一個節點的指針),node[24].link=-1(表示節點24是鍊表中的最後一個節點)。在繪製鍊表時,可以把每個連結指針畫成一個箭頭(如圖所示),與使用C++指針的時候一樣。
實現
為了實現指針的模擬,需要設計一個過程來分配和釋放一個節點。當前未被使用的節點將被放入一個存儲池(storage pool)之中。開始時,存儲池中包含了所有節點node[0:Number-OfNodes-l]。Allocate從存儲池中取出節點,每次取出一個。Deallocate則將節點放入存儲池中,每次放入一個。因此,Allocate和Deallocate分別對存儲池執行插入和刪除操作,等價於C++函式delete和new。如果存儲池是一個節點鍊表(如圖所示),這兩個函式可以高效地執行。
用作存儲池的鍊表被稱之為可用空間表(available space list),其中包含了當前未使用的所有節點。first是一個類型為int的變數,它指向可用空間表中的第一個節點。添加和刪除操作都是在可用空間表的前部進行的。
模擬指針的類定義
為了實現一個模擬指針系統,定義了SimNode類和SimSpace類,具體代碼如下所示:
SimSpace 的操作
由於所有節點初始時都是自由的,因此在剛被創建的時候,可用空間表中包含NumberOfNodes個節點。用來對可用空間表進行初始化。如下兩個程式分別實現Allocate和Deallocate操作。
使用模擬指針分配一個節點
採用模擬指針的鍊表
可以使用模擬空間S來定義一個鍊表類。S被說明為一個static成員,目的是使所有類型為T的模擬鍊表共享相同的模擬空間。如下程式給出了除Search和Output之外的各共享函式的代碼。這些代碼假定SimChain已經被說明為SimNode和SimSpace的友元。