在派生类型过程中区分头节点和其他节点

时间:2019-01-02 18:43:21

标签: linked-list fortran

我正在处理看起来像这样的模块:

module linked_elems

type link
  integer :: i
  double precision :: a
  type(link), pointer :: parent=>null()
  type(link), pointer :: child=>null()
contains
  procedure forward_op
  ! and all the usual linked list stuff
end type

type(link), target :: head

contains

subroutine forward_op(ln)

class(link), target :: ln

! do stuff to ln%i and ln%a

! if ln == head do extra stuff to ln%i and ln%a

!Operands of comparison operator '==' at (1) are CLASS(link)/TYPE(link)V
!if (ln == head) then  
!  print *,'ln is head'
!endif

!Error: ‘pointer’ argument of ‘associated’ intrinsic at (1) must be a POINTER
!if (associated(ln, head)) then  
!  print *, 'ln is head'
!endif

end subroutine

end module

实际模块涉及更多,但这说明了我遇到的问题。在subroutine forward_op()中,链表的头节点与其他任何节点都需要稍有不同。我在弄清楚子例程如何分辨它是否正在处理头节点方面遇到了麻烦。在代码中,我尝试了两种方法,以及它们给出的编译错误。

我可以通过以下事实来区分头节点:如果正确执行代码,它将是其父元素未关联的唯一节点。但是,也许有人会在以后出现,并尝试将代码以某种方式使用,例如,需要一种循环链表的方式,那么父标准将不起作用。无论如何,在我看来,最好是找到一种仅根据其自身在内存中的存在量来检测头节点的方法,除了其任何元素的值。有办法吗?

0 个答案:

没有答案