1

私は、「Indefined_Douly_Linked_Lists」リストを使用して、Ada で一般的な数値のスタックをプログラムしました。

ポップ & プッシュ操作は、append と delete_last で実装されますが、並べ替え方法では、リストの個々の項目にアクセスする必要があります。

私は、append/prepend 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 に答える