从gen_ll.f90反转Fortran链表的顺序

时间:2018-03-14 19:47:05

标签: linked-list fortran

我最近在Fortran中使用了链接列表,经过一些阅读决定使用gen_ll.f90 package中的Fortran Wiki,这似乎很简单,足以满足我的需求。

后来我意识到我必须颠倒列表中术语的顺序(即1-> 2-> 3-> ...->> N> NULL需要N-> ...-> 3→2→1→NULL)。 我试图生成一个函数来替换前一个而不是下一个指针%P%。逻辑似乎很好,但我一直在弄乱它。 我会请求您编写这个小功能的帮助。 源代码附加在gen_ll.f90链接中,函数/子例程是直接的。

这是一个示例源代码,是我做过的几次尝试之一。 不确定这是否是正确的,因为我现在已经达到了追踪和错误的目的,只是为了理解,所以这可能是完全无稽之谈。

SUBROUTINE LI_Flip_Direction(List)
  IMPLICIT NONE
  TYPE(List_Type),INTENT(INOUT),TARGET :: List
  TYPE(Link_Ptr_Type) :: Prev,Curr,Next

  Curr%P => List%Head%Next
  Next%P => Curr%P%Next
  NULLIFY(Prev%P)

  ! Loop:
  DO WHILE (ASSOCIATED(Next%P))
     Next%P => Curr%P%Next
     Curr%P%Next => Prev%P
     Prev%P => Curr%P
     Curr%P => Next%P
  ENDDO

  ! Reached the new HEAD:
  List%Head%Next => Curr%P

  RETURN

END SUBROUTINE LI_Flip_Direction

2 个答案:

答案 0 :(得分:0)

我建议使用所提供的源代码中提供的功能。由于您尝试还原单向链接列表,因此最好检索头并将其添加到新链接列表的头部。所以你可以这样做:

subroutine LI_Flip_Direction(list)
  implicit none
  type(List_Type),intent(inout) :: list
  type(List_Type)               :: tmp
  type(Link_Ptr_Type)           :: link

  call LI_Init_List(tmp)
  do while(associated(list%Head%Next))
     link = LI_Remove_Head(list)
     call LI_Add_To_Head(link,tmp)
  end do
  if (associated(tmp%Head%Next)) list%Head%Next => tmp%Head%Next
  nullify(tmp%Head%Next)
end subroutine LI_Flip_Direction

考虑到这里的所有内容都取决于所使用代码的良好实现。

答案 1 :(得分:-1)

这是一个子程序的代码,它使用链接的"库来反转现有列表的顺序" (gen_ll.f90),供您使用:

SUBROUTINE LI_Flip_Direction(List)
  IMPLICIT NONE
  TYPE(List_Type),INTENT(INOUT),TARGET :: List
  TYPE(Link_Ptr_Type) :: Prev,Curr,Next

  Curr%P => List%Head%Next
  NULLIFY(Prev%P)

  ! Loop:
  DO WHILE (ASSOCIATED(Curr%P))
   Next%P => Curr%P%Next
   Curr%P%Next => Prev%P
   Prev%P => Curr%P
   Curr%P => Next%P
  ENDDO

  ! Reached the new HEAD:
  List%Head%Next => Prev%P

  RETURN

END SUBROUTINE LI_Flip_Direction