我试图引入一个字符串并将其逐个字符分配给链表,声明如下:
type lstring is private;
type lstring_node;
type lstring_access is access lstring_node;
type lstring_node is
record
Char : character;
Position : integer;
Next : lstring_access;
end record;
private
type lstring is
record
First : lstring_access := null;
end record;
赋值函数如下所示:
function toLstring (Input : string) return lstring is
LStr : lstring;
Current : lstring_access;
begin
-- Set the first item of LStr as Current.
-- LStr will from now on inherit the items of Current.
LStr.First := new lstring_node;
Current := LStr.First;
-- Iterate through the string and add it to the lstring.
for I in 1..Input'Length loop
if I /= 1 then
Current := new lstring_node;
end if;
Current.Char := Input(I);
Ada.Text_IO.Put(Current.Char);
Current.Position := I;
Current := Current.Next;
end loop;
-- Return the new lstring.
return LStr;
end toLstring;
通过调试,我知道for循环工作得很好,元素被赋值给Current也很好。但由于某些原因,这些物品没有被添加到LStr中。我需要在for循环之后声明一些东西来完成它吗?我的印象是因为Current被分配到LStr。首先,LStr将继承追加列表的其余部分。我错了吗?
谢谢
在循环结束时,将Current.Next
(此时为null)赋值给Current
。这是一个值副本。在下一次迭代中改变Current
的值不会改变前一个节点的Next
的值。(请注意,Current.Char
和Current.Next
是隐式解引用,实际上会执行Current.all.Char
/Next
,但Current := new lstring_node
不是解引用,因为它改变了引用的值。)
相反,您应该将new lstring_node
分配给Next
,然后推进Current
引用:
for I in Input'Range loop
Current.Char := Input(I);
Ada.Text_IO.Put(Current.Char);
Current.Position := I - Input'First + 1;
if I /= Input'Last then
Current.Next := new lstring_node;
Current := Current.Next;
end if;
end loop;
请注意,我改变了循环范围(字符串不需要从1开始)并调整了位置计算,因此您将在列表中以1为基础的位置索引结束。