1

我使用“Indefinite_Doubly_Linked_Lists”列表在 Ada 中编写了一堆通用数字。

弹出和推送操作是通过 append 和 delete_last 实现的,但对于排序方法,我需要访问列表的各个项目。

我确实制定了一种仅使用追加/前置 delete_last/first 的排序方法,但结果远非优雅(而且可能不正确)

procedure sort is
   elem1: Item;
   elem2: Item;
   --l is a package-private Indefinite_Doubly_linked_lists'
begin
   if Integer(MyList.Length(l)) > 1 then
      for i in 0 .. Integer(MyList.Length(l))-1 loop
         for j in 0 .. Integer(MyList.Length(l))-1 loop
            --Inner sort loop
            elem1 := MyList.Element(l.first);
            l.Delete_First;
            elem2 := MyList.Element(l.first);
            l.Delete_First;
            if elem1>elem2 then
               l.Prepend(elem1);
               l.Append(elem2);
            else
               l.Prepend(elem2);
               l.Append(elem1);
            end if;
         end loop;
      end loop;
   end if;
end;

如何从泛型类型列表中访问单个元素(或迭代)?

4

1 回答 1

4

几件事:

除非你练习的重点是写一个排序,否则你可以……呃……使用通用排序:

package List_Sort is new MyList.Generic_Sorting;

如果您使用的是 Ada 2012 编译器,广义循环可让您轻松访问每个元素:

procedure Iterate is 
begin
   for Elem of L loop
      Put_Line(Item'Image(Elem));
   end loop;
end Iterate;

如果您不使用 Ada 2012,您可以自行使用游标:

procedure Cursor_Iterate is

   C : MyList.Cursor := L.First;

   use type MyList.Cursor;

begin
   loop 
      exit when C = MyList.No_Element;
      Put_Line(Item'Image(MyList.Element(C)));
      MyList.Next(C);
   end loop;
end Cursor_Iterate;

或使用 MyList 的 Iterate 过程:

procedure Iterate
  (Container : in List;
   Process   : not null access procedure (Position : in Cursor));
于 2012-09-27T15:39:54.000 回答