2012-09-27 87 views
1

我使用'Indefinite_Doubly_Linked_Lists'列表在Ada中編寫了一堆通用數字。Ada:訪問通用列表中的單個元素

Pop &推送操作是用append和delete_last實現的,但是對於需要訪問列表中單個項目的排序方法。

我也只使用附加/添加delete_last /第一,但結果是遠離優雅的(也許不正確)

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; 

我可以訪問單個元素如何制定出一個排序方法(或迭代)從一個泛型類型的列表?

回答

3

有兩件事情:

除非你練習的點是寫一個排序,你可以只...呃...使用通用的排序:

package List_Sort is new MyList.Generic_Sorting; 

如果您在使用阿達的編譯器2012,generalized looping讓您輕鬆訪問到每一個元素:

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

如果你不使用艾達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的迭代過程:

procedure Iterate 
    (Container : in List; 
    Process : not null access procedure (Position : in Cursor)); 
+0

我剛發現了這個解決方案5分鐘前。 (光標一) – NeonMan