通用链表

时间:2016-04-29 13:30:22

标签: generics ada gnat

我正在写一个链表。这是我的代码:

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;

当列表带有虚拟头时,我不知道如何添加Head(Has_Dummy_Head为true)。我尝试将Node中的Data字段设置为null,但我不起作用。我不知道如何得到T型的一些价值。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用

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

而不是

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

(或者更确切地说是一个常数Null_Node或其他一些)。

但总的来说,没有价值往往表明包装组织存在缺陷。你真的需要假头吗?为什么不简单地将Head指针设置为null?我知道出于性能原因,有一个虚拟头可能会节省几个if Head /= null then测试,但你已经达到了这个优化级别吗?