我正在写一个链表。这是我的代码:
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型的一些价值。
答案 0 :(得分:2)
您可以尝试使用
Head => new Node'(Data => <>, Next => null)
而不是
Head => Get_New_Node(Data => null, Next => null)
(或者更确切地说是一个常数Null_Node
或其他一些)。
但总的来说,没有价值往往表明包装组织存在缺陷。你真的需要假头吗?为什么不简单地将Head指针设置为null?我知道出于性能原因,有一个虚拟头可能会节省几个if Head /= null then
测试,但你已经达到了这个优化级别吗?