2016-04-29 46 views
0

我在寫鏈接列表。這裏是我的代碼:通用鏈接列表中的虛擬節點

Linked_List.ads

generic 
    type T is private; 
package Linked_List is 
    type Node; 
    type NodeAccess is access Node; 
    type Node is record 
     Data : T; 
     Next : NodeAccess := null; 
    end record; 
    type List is record 
     Head : NodeAccess; 
     Has_Dummy_Head : Boolean; 
     Size : Integer; 
    end record; 
    type ListAccess is access List; 
    function Get_New_List(Has_Dummy_Head : Boolean) return ListAccess; 
private 
    function Get_New_Node(Data : T; Next : NodeAccess) return NodeAccess; 
end Linked_List; 

Linked_List.adb

package body Linked_List is 
    function Get_New_Node(Data : T; Next : NodeAccess) return NodeAccess is 
     New_Node : NodeAccess := new Node; 
    begin 
     New_Node.all := (Data => Data, Next => Next); 
     return New_Node; 
    end Get_New_Node; 
    function Get_New_List(Has_Dummy_Head : Boolean) return ListAccess is 
     New_List : ListAccess := new List; 
    begin 
     if Has_Dummy_Head = True then 
     New_List.all := (Head => Get_New_Node(Data => null, Next => null), Has_Dummy_Head => True, Size => 0); 
     else 
     New_List.all := (Head => null, Has_Dummy_Head => False, Size => 0); 
     end if; 
     return New_List; 
    end Get_New_List; 
end Linked_List; 

我不知道如何添加頭時,列表與假人頭部(Has_Dummy_Head是真的)。我試着將節點中的數據字段設置爲空,但我沒有工作。我不知道怎麼去T類型

回答

2

的一些價值你可以嘗試使用的

Head => new Node'(Data => <>, Next => null) 

代替

Head => Get_New_Node(Data => null, Next => null) 

(或者說定義的常數Null_Node或一些這樣的)。

但一般來說,沒有價值往往表明組織的缺陷。你真的需要一個假頭?爲什麼不簡單地設置頭指針爲空?我知道,出於性能的考慮,擁有虛擬頭部可能會節省一些if Head /= null then測試,但您是否已經處於該優化級別?

+0

我不能讓它工作。如果我用Get_New_Node(Data =><>,​​Next => null)替換 Get_New_Node(Data => null,Next => null) I「丟失操作數」錯誤。 如果我添加() Get_New_Node(Data =>(<>),Next => null) 我得到「(Ada 2005)框只允許與命名符號」錯誤 順便說一句我正在這樣做的教育目的。 –

+0

方框符號(「<>」)只能用於聚合中(正如我在調用'new Node'時所做的那樣)。您不能將此作爲子程序調用傳遞。正如我所提到的,如果您真的需要,您可以定義一個常量(使用聚合進行初始化)並將其傳遞給Get_New_Node。但是,如果你需要這個,它可能表明一個設計可能會有更好的不同。 – manuBriot