2016-04-29 13 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が真であります)。 NodeのDataフィールドをnullに設定してみましたが、動作しません。私はあなたが

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

代わりの

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

(というかNull_Node定数またはそのようないくつかの定義された)を使用して試みることができるタイプのT.

答えて

2

のいくつかの値を取得する方法がわかりません。

しかし、一般的に値を持たないのは、パッケージの組織の欠陥を示す傾向があります。ダミーヘッドが本当に必要ですか?単純にHeadポインタをnullに設定しないのはなぜですか?パフォーマンス上の理由からダミーヘッドを使用すると、if Head /= null thenテストの数が減るかもしれませんが、すでに最適化のレベルにいるのですか?

+0

私はそれを動作させることはできません。 Get_New_Node(データ=> null、次=> null) とGet_New_Node(データ=><>、次=> null)を置き換えた場合 「オペランドが見つかりません」というエラーが発生しました。 Get_New_Node(データ=>(<>)、次=>ヌル) "(Ada 2005)ボックスには名前付き表記のみが許可されています"エラーが発生しました Btw私は教育目的でこの作業を行っています。 –

+0

ボックス記法( "<>")は集約でのみ使用できます( 'new Node'の呼び出しと同じです)。これをサブプログラム呼び出しとして渡すことはできません。私が言及したように、あなたが本当に必要な場合は、定数を定義して(集約で初期化して)Get_New_Nodeに渡すことができます。しかし、もう一度、もしあなたがこれを必要とするならば、それは異なったやり方で良いかもしれないデザインを示すかもしれません。 – manuBriot