2016-04-29 8 views
0

Ich schreibe eine verknüpfte Liste. Hier ist mein Code:Dummy-Knoten in generische verkettete Liste

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; 

Ich weiß nicht, wie der Kopf hinzufügen, wenn die Liste mit Dummy-Kopf (Has_Dummy_Head ist wahr). Ich habe versucht, nur das Datenfeld im Knoten auf Null zu setzen, aber ich arbeite nicht. Ich weiß nicht, wie man einen Wert vom Typ T erhalten

Antwort

2

Sie könnten versuchen,

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

statt

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

(oder besser gesagt definiert eine konstante Null_Node oder so) verwendet wird.

Aber im Allgemeinen weist ein Wert nicht auf einen Fehler in der Organisation des Pakets hin. Brauchst du wirklich einen Kunstkopf? Warum nicht einfach den Head-Zeiger auf null setzen? Ich weiß, dass ein Dummy-Kopf aus Leistungsgründen ein paar if Head /= null then Tests speichern kann, aber sind Sie bereits auf dieser Ebene der Optimierung?

+0

Ich kann es nicht funktionieren lassen. Wenn ich ersetze Get_New_Node (Daten => Null, Next => null) mit Get_New_Node (Daten =><>, Weiter => null) Ich "fehlender Operand" Fehler. Wenn ich addiere() Get_New_Node (Daten => (<>), Next => null) Ich bekomme "(Ada 2005) Box nur mit benannter Notation erlaubt" Fehler Btw Ich mache das für Bildungszwecke. –

+0

Die Boxnotation ("<>") kann nur in Aggregaten verwendet werden (wie beim Aufruf von 'new Node'). Sie können dies nicht als Unterprogrammaufruf übergeben. Wie ich bereits erwähnt habe, könnten Sie eine Konstante (initialisiert mit einem Aggregat) definieren und sie an Get_New_Node übergeben, wenn Sie wirklich brauchen. Aber wenn Sie das brauchen, könnte das ein Design sein, das vielleicht besser anders geht. – manuBriot