Ada 编程/库/Ada.Containers.双向链表
外观
此语言功能仅从 Ada 2005 开始提供。
Ada.Containers.Doubly_Linked_Lists 是自 Ada 2005 以来 预定义语言环境 的一个单元。
Ada 2005 的主要新增功能之一是 容器 库。此库使 Ada 开发人员能够操纵数据结构,如双向链表、映射、集合和向量。本页面将展示 Ada.Containers.Doubly_Linked_Lists 库的工作原理。
双向链表只是一种链表,其中每个元素不仅链接到下一个元素,还链接到上一个元素。有关更多信息,请参见 双向链表。
这是来自现有项目的示例用法。
worm.ads
此文件表示蠕虫的规范。
with
Ada.Containers.Doubly_Linked_Lists;with
Wormlevel, Protocol; -- , Handlers;package
Wormis
use
Wormlevel, Protocol; -- , Handlers;package
Worm_Position_Containeris
new
Ada.Containers.Doubly_Linked_Lists(Position);use
Worm_Position_Container;type
Worm_Stateis
(Alive,Dead,Observing);type
Worm_Typeis
record
Worm_Body : List; Direction : Course := North; Points : Natural := 0; Number : Positive; State : Worm_State := Alive; Full : Boolean := False;end
record
;type
Worm_Type_Accessis
access
Worm_Type;procedure
Update_Worm (Worm :in
Worm_Type_Access; Lvl :in
Level_Access);procedure
Turn_Left (Worm :in
Worm_Type_Access);procedure
Turn_Right (Worm :in
Worm_Type_Access);procedure
Kill (Worm :in
Worm_Type_Access);end
Worm;
如您所见,Ada.Containers.Doubly_Linked_Lists 使用名为“Position”的类型实例化。此类型表示二维数组中的瓦片类型。蠕虫主体现在由双向链表表示,这意味着我们可以使用 Next 和 Previous 函数,在任一方向遍历每个元素。
对于有兴趣的人来说,该游戏可以在 GitHub 上找到。
-- Standard Ada library specification -- Copyright (c) 2003-2018 Maxim Reznik <[email protected]> -- 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 -- -------------------------------------------------------------------------generic
type
Element_Typeis
private
;with
function
"=" (Left :in
Element_Type; Right :in
Element_Type)return
Booleanis
<>;package
Ada.Containers.Doubly_Linked_Listsis
pragma
Preelaborate (Doubly_Linked_Lists);type
Listis
tagged
private
;pragma
Preelaborable_Initialization (List);type
Cursoris
private
;pragma
Preelaborable_Initialization (Cursor); Empty_List :constant
List; No_Element :constant
Cursor;function
"=" (Left :in
List; Right :in
List)return
Boolean;function
Length (Container :in
List)return
Count_Type;function
Is_Empty (Container :in
List)return
Boolean;procedure
Clear (Container :in
out
List);function
Element (Position :in
Cursor)return
Element_Type;procedure
Replace_Element (Container :in
out
List; Position :in
Cursor; New_Item :in
Element_Type);procedure
Query_Element (Position :in
Cursor; Process :not
null
access
procedure
(Element :in
Element_Type));procedure
Update_Element (Container :in
out
List; Position :in
Cursor; Process :not
null
access
procedure
(Element :in
out
Element_Type));procedure
Move (Target :in
out
List; Source :in
out
List);procedure
Insert (Container :in
out
List; Before :in
Cursor; New_Item :in
Element_Type; Count :in
Count_Type := 1);procedure
Insert (Container :in
out
List; Before :in
Cursor; New_Item :in
Element_Type; Position :out
Cursor; Count :in
Count_Type := 1);procedure
Insert (Container :in
out
List; Before :in
Cursor; Position :out
Cursor; Count :in
Count_Type := 1);procedure
Prepend (Container :in
out
List; New_Item :in
Element_Type; Count :in
Count_Type := 1);procedure
Append (Container :in
out
List; New_Item :in
Element_Type; Count :in
Count_Type := 1);procedure
Delete (Container :in
out
List; Position :in
out
Cursor; Count :in
Count_Type := 1);procedure
Delete_First (Container :in
out
List; Count :in
Count_Type := 1);procedure
Delete_Last (Container :in
out
List; Count :in
Count_Type := 1);procedure
Reverse_Elements (Container :in
out
List);procedure
Swap (Container :in
out
List; I :in
Cursor; J :in
Cursor);procedure
Swap_Links (Container :in
out
List; I :in
Cursor; J :in
Cursor);procedure
Splice (Target :in
out
List; Before :in
Cursor; Source :in
out
List);procedure
Splice (Target :in
out
List; Before :in
Cursor; Source :in
out
List; Position :in
out
Cursor);procedure
Splice (Container :in
out
List; Before :in
Cursor; Position :in
Cursor);function
First (Container :in
List)return
Cursor;function
First_Element (Container :in
List)return
Element_Type;function
Last (Container :in
List)return
Cursor;function
Last_Element (Container :in
List)return
Element_Type;function
Next (Position :in
Cursor)return
Cursor;function
Previous (Position :in
Cursor)return
Cursor;procedure
Next (Position :in
out
Cursor);procedure
Previous (Position :in
out
Cursor);function
Find (Container :in
List; Item :in
Element_Type; Position :in
Cursor := No_Element)return
Cursor;function
Reverse_Find (Container :in
List; Item :in
Element_Type; Position :in
Cursor := No_Element)return
Cursor;function
Contains (Container :in
List; Item :in
Element_Type)return
Boolean;function
Has_Element (Position :in
Cursor)return
Boolean;procedure
Iterate (Container :in
List; Process :not
null
access
procedure
(Position :in
Cursor));procedure
Reverse_Iterate (Container :in
List; Process :not
null
access
procedure
(Position :in
Cursor));generic
with
function
"<" (Left :in
Element_Type; Right :in
Element_Type)return
Booleanis
<>;package
Generic_Sortingis
function
Is_Sorted (Container :in
List)return
Boolean;procedure
Sort (Container :in
out
List);procedure
Merge (Target :in
out
List; Source :in
out
List);end
Generic_Sorting;private
type
Listis
tagged
null
record
; Empty_List :constant
List := (null
record
);type
Cursoris
null
record
; No_Element :constant
Cursor := (null
record
);end
Ada.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