模擬指針

模擬指針

採用一個節點數組以及對該數組進行索引的模擬指針 ,可以使設計更方便、 更高效。模擬指針是使用一段連續的存儲區來模擬指針的功能,可以有效的利用一段連續記憶體進行一定範圍內可變的子鍊表的空間分配。

簡介

模擬指針的鍊表 模擬指針的鍊表

假定採用一個數組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的友元。

模擬鍊表的類定義

構造函式和Length函式

Find函式

Delete函式

Insert函式

相關詞條

熱門詞條

聯絡我們