【问题标题】:Can I create a Linked list in Fortran only using ALLOCATABLE variables and not pointers?我可以只使用 ALLOCATABLE 变量而不是指针在 Fortran 中创建链接列表吗?
【发布时间】:2021-12-01 06:59:50
【问题描述】:

我可以用这种方式创建一个没有指针的 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

此列表在用于创建链接列表时是否有效?什么可能出错,有什么缺点吗?指针相对于可分配对象的优势是什么?

【问题讨论】:

  • Fortran 2008 允许我使用,但进入编译器需要很长时间。深拷贝存在问题。
  • 这个链表会工作吗?是否比使用指针更好?
  • 我说是允许的(递归可分配)。什么是“更好”可能是相当主观的。这是一个相对较新的东西,很少有人会在多个编译器方面有实践经验。编译它,你会看到它的效果如何。
  • 我将测试这个 Linked List 的实现并上传到 Git。谢谢你帮助我@VladimirF
  • 我不认为这个实现可以处理在列表中插入新元素而不产生O(N) 成本?这会比由指针组成的链表更糟糕。

标签: linked-list fortran fortran2008


【解决方案1】:
  • Linked List 的 TailList 应该是一个 Pointer。 CurrList 可以是 ALLOCATABLE 或 POINTER。

  • CurrList ALLOCATABLE 的缺点是 1) 为每个 Connect 重置为 HeadList 和 2) 用于在 CurrList 下存储部分 Linked List 的额外副本(内存)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2021-04-21
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多