Ada 程式設計/庫/Ada.Containers.雙向連結串列
外觀
此語言功能僅從 Ada 2005 開始提供。
Ada.Containers.Doubly_Linked_Lists 是自 Ada 2005 以來 預定義語言環境 的一個單元。
Ada 2005 的主要新增功能之一是 容器 庫。此庫使 Ada 開發人員能夠操縱資料結構,如雙向連結串列、對映、集合和向量。本頁面將展示 Ada.Containers.Doubly_Linked_Lists 庫的工作原理。
雙向連結串列只是一種連結串列,其中每個元素不僅連結到下一個元素,還連結到上一個元素。有關更多資訊,請參見 雙向連結串列。
這是來自現有專案的示例用法。
worm.ads
此檔案表示蠕蟲的規範。
withAda.Containers.Doubly_Linked_Lists;withWormlevel, Protocol; -- , Handlers;packageWormisuseWormlevel, Protocol; -- , Handlers;packageWorm_Position_ContainerisnewAda.Containers.Doubly_Linked_Lists(Position);useWorm_Position_Container;typeWorm_Stateis(Alive,Dead,Observing);typeWorm_TypeisrecordWorm_Body : List; Direction : Course := North; Points : Natural := 0; Number : Positive; State : Worm_State := Alive; Full : Boolean := False;endrecord;typeWorm_Type_AccessisaccessWorm_Type;procedureUpdate_Worm (Worm :inWorm_Type_Access; Lvl :inLevel_Access);procedureTurn_Left (Worm :inWorm_Type_Access);procedureTurn_Right (Worm :inWorm_Type_Access);procedureKill (Worm :inWorm_Type_Access);endWorm;
如您所見,Ada.Containers.Doubly_Linked_Lists 使用名為“Position”的型別例項化。此型別表示二維陣列中的瓦片型別。蠕蟲主體現在由雙向連結串列表示,這意味著我們可以使用 Next 和 Previous 函式,在任一方向遍歷每個元素。
對於有興趣的人來說,該遊戲可以在 GitHub 上找到。
-- Standard Ada library specification -- Copyright (c) 2003-2018 Maxim Reznik <reznikmm@gmail.com> -- Copyright (c) 2004-2016 AXE Consultants -- Copyright (c) 2004, 2005, 2006 Ada-Europe -- Copyright (c) 2000 The MITRE Corporation, Inc. -- Copyright (c) 1992, 1993, 1994, 1995 Intermetrics, Inc. -- SPDX-License-Identifier: BSD-3-Clause and LicenseRef-AdaReferenceManual -- -------------------------------------------------------------------------generictypeElement_Typeisprivate;withfunction"=" (Left :inElement_Type; Right :inElement_Type)returnBooleanis<>;packageAda.Containers.Doubly_Linked_ListsispragmaPreelaborate (Doubly_Linked_Lists);typeLististaggedprivate;pragmaPreelaborable_Initialization (List);typeCursorisprivate;pragmaPreelaborable_Initialization (Cursor); Empty_List :constantList; No_Element :constantCursor;function"=" (Left :inList; Right :inList)returnBoolean;functionLength (Container :inList)returnCount_Type;functionIs_Empty (Container :inList)returnBoolean;procedureClear (Container :inoutList);functionElement (Position :inCursor)returnElement_Type;procedureReplace_Element (Container :inoutList; Position :inCursor; New_Item :inElement_Type);procedureQuery_Element (Position :inCursor; Process :notnullaccessprocedure(Element :inElement_Type));procedureUpdate_Element (Container :inoutList; Position :inCursor; Process :notnullaccessprocedure(Element :inoutElement_Type));procedureMove (Target :inoutList; Source :inoutList);procedureInsert (Container :inoutList; Before :inCursor; New_Item :inElement_Type; Count :inCount_Type := 1);procedureInsert (Container :inoutList; Before :inCursor; New_Item :inElement_Type; Position :outCursor; Count :inCount_Type := 1);procedureInsert (Container :inoutList; Before :inCursor; Position :outCursor; Count :inCount_Type := 1);procedurePrepend (Container :inoutList; New_Item :inElement_Type; Count :inCount_Type := 1);procedureAppend (Container :inoutList; New_Item :inElement_Type; Count :inCount_Type := 1);procedureDelete (Container :inoutList; Position :inoutCursor; Count :inCount_Type := 1);procedureDelete_First (Container :inoutList; Count :inCount_Type := 1);procedureDelete_Last (Container :inoutList; Count :inCount_Type := 1);procedureReverse_Elements (Container :inoutList);procedureSwap (Container :inoutList; I :inCursor; J :inCursor);procedureSwap_Links (Container :inoutList; I :inCursor; J :inCursor);procedureSplice (Target :inoutList; Before :inCursor; Source :inoutList);procedureSplice (Target :inoutList; Before :inCursor; Source :inoutList; Position :inoutCursor);procedureSplice (Container :inoutList; Before :inCursor; Position :inCursor);functionFirst (Container :inList)returnCursor;functionFirst_Element (Container :inList)returnElement_Type;functionLast (Container :inList)returnCursor;functionLast_Element (Container :inList)returnElement_Type;functionNext (Position :inCursor)returnCursor;functionPrevious (Position :inCursor)returnCursor;procedureNext (Position :inoutCursor);procedurePrevious (Position :inoutCursor);functionFind (Container :inList; Item :inElement_Type; Position :inCursor := No_Element)returnCursor;functionReverse_Find (Container :inList; Item :inElement_Type; Position :inCursor := No_Element)returnCursor;functionContains (Container :inList; Item :inElement_Type)returnBoolean;functionHas_Element (Position :inCursor)returnBoolean;procedureIterate (Container :inList; Process :notnullaccessprocedure(Position :inCursor));procedureReverse_Iterate (Container :inList; Process :notnullaccessprocedure(Position :inCursor));genericwithfunction"<" (Left :inElement_Type; Right :inElement_Type)returnBooleanis<>;packageGeneric_SortingisfunctionIs_Sorted (Container :inList)returnBoolean;procedureSort (Container :inoutList);procedureMerge (Target :inoutList; Source :inoutList);endGeneric_Sorting;privatetypeLististaggednullrecord; Empty_List :constantList := (nullrecord);typeCursorisnullrecord; No_Element :constantCursor := (nullrecord);endAda.Containers.Doubly_Linked_Lists;
外部示例
[編輯原始碼]- 在以下位置搜尋
Ada.Containers.Doubly_Linked_Lists的 示例: Rosetta Code、GitHub (gists)、任何 Alire 包 或 本華夏公益教科書。 - 在以下位置搜尋與
Ada.Containers.Doubly_Linked_Lists相關的 帖子: Stack Overflow、comp.lang.ada 或 任何與 Ada 相關的頁面。
FSF GNAT
- 規範: a-cdlili.ads
- 主體: a-cdlili.adb
drake
