我可以创建一个链表在Fortran只使用ALLOCATABLE变量,而不是指针?



我可以这样创建一个没有指针的Fortran链表吗?

:

TYPE Allocation_List   
PRIVATE  
CLASS(*), ALLOCATABLE :: Item
CLASS(Allocation_List), ALLOCATABLE :: Next

CONTAINS
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: IsItem   => IsItem_AllocationList
PROCEDURE, PASS(self), PUBLIC                  :: SetItem  => SetItem_AllocationList
PROCEDURE, PASS(self), PUBLIC                  :: GetItem  => GetItem_AllocationList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: FreeItem => FreeItem_AllocationList

PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: IsNext   => IsNext_AllocationList
PROCEDURE, PASS(self), PUBLIC                  :: SetNext  => SetNext_AllocationList
PROCEDURE, PASS(self), PUBLIC                  :: GetNext  => GetNext_AllocationList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: FreeNext => FreeNext_AllocationList

PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: Reset    => Reset_AllocationList

PROCEDURE, PASS(self), PUBLIC                  :: Display  => Display_AllocationListItem
END TYPE Allocation_List

链接列表:

TYPE Allocation_LinkedList
PRIVATE  
CLASS(Allocation_List), ALLOCATABLE :: HeadList
CLASS(Allocation_List), ALLOCATABLE :: CurrList
CLASS(Allocation_List), ALLOCATABLE :: TailList  

CONTAINS
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: IsSet     => IsSet_AllocationLinkedList

PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: Initiate  => Initiate_AllocationLinkedList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: Connect   => Connect_AllocationLinkedList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: GetCurr   => GetCurrent_AllocationLinkedList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: ForCurr   => ForwardCurrent_AllocationLinkedList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: DispCurr  => DisplayCurrent_AllocationLinkedList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: ResetCurr => ResetCurrent_AllocationLinkedList

PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: Reset     => Reset_AllocationLinkedList
PROCEDURE, PASS(self), PUBLIC, NON_OVERRIDABLE :: Display   => Display_AllocationLinkedList

END TYPE Allocation_LinkedList

当这个列表被用来创建链表时,它会工作吗?可能会出现什么问题,有什么缺点吗?指针相对于可分配对象有什么优势?

  • 链表的尾部列表应该是一个指针。CurrList可以是ALLOCATABLE或POINTER类型。

  • CurrList ALLOCATABLE的缺点是1)每次连接时重置为HeadList, 2)用于在CurrList下存储部分链表的额外副本(内存)。

下面是使用可分配资源和指针的链表实现:https://github.com/AkhilAkkapelli/DataStructures/tree/main/LinkedList

最新更新