Data structures 列出Ada中的节点

Data structures 列出Ada中的节点,data-structures,linked-list,nodes,ada,Data Structures,Linked List,Nodes,Ada,所以我正在用Ada写一个链表——一个非常简单的任务。在list.ads文件中,我声明一个列表节点,如下所示: type Node; type Node_Ptr is access Node; type Node is record Data: Integer; Next: Node_Ptr; end record; 在adb文件中,我将head节点声明为sentinel: Head: Node_Ptr := new Node_Ptr'(null, null); 从我读到的和看到的来

所以我正在用Ada写一个链表——一个非常简单的任务。在list.ads文件中,我声明一个列表节点,如下所示:

type Node;
type Node_Ptr is access Node;

type Node is record
  Data: Integer;
  Next: Node_Ptr;
end record;
在adb文件中,我将head节点声明为sentinel:

Head: Node_Ptr := new Node_Ptr'(null, null);

从我读到的和看到的来看,这应该行得通。然而,当我尝试编译时,它告诉我在list.ads中声明了预期的类型节点,尽管我已经定义了该类型。奇怪的是,它告诉我Node_Ptr是正确定义的,但Node不是。给出了什么?

带有错误的行是

   Head: Node_Ptr := new Node_Ptr'(null, null);
GNAT GPL 2014给出的错误消息是

list.adb:2:34: expected type "Node" defined at list.ads:5
list.adb:2:34: found type "Node_Ptr" defined at list.ads:3
指向节点的最后一个字符后面的';编译器已看到Head:Node_Ptr:=new,并且需要类型Node

相比之下,GCC 4.9.1说

list.adb:2:35: expected type "Node_Ptr" defined at list.ads:3
list.adb:2:35: found a composite type
指向空的开头部分,空;它已经看到了Node_Ptr'并对null进行了充分的分析,以确定它是一个复合类型,并且不可能是与Node_Ptr兼容的值

如前所述,分配价值的正确方法是

FP : Foo_Ptr := new {value of type Foo};
还是你的情况

Head : Node_Ptr := new Node'(null, null);
。。但这在两个编译器上都失败了

list.adb:2:33: expected type "Standard.Integer"
list.adb:2:33: found an access type
指向第一个空值

我想您可能可以从那里修复它。

:=new Node'0,null。。。New创建一个新对象而不是ptr,null不是有效的整数。您也可以使用字段的命名符号来表示New Node'Data=>0,Next=>null。