在Ada中将字符串分配给链表的问题



我试图引入一个字符串并将其逐个字符分配给链表,声明如下:

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.CharCurrent.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为基础的位置索引结束。

相关内容

  • 没有找到相关文章

最新更新