我最近在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
答案 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