Fortran 保持头部指向第一个元素/添加到列表的尾部
Fortran keeping head pointing at first element / adding to tail of the list
我正在尝试将稀疏向量实现为 Fortran95 中的链表。列表节点具有索引和组件值。当我尝试将向量保存为列表时,头部最终指向添加的最后一个节点,我似乎无法让它指向 "smallest index"
我想要的是我的列表结尾是这样的
head => node1 => node2 => node3 => NULL
我目前得到的(来自输出)
head=> node3 => node 2 => node 1
MODULE sparse
IMPLICIT NONE
! INTERFACE OPERATOR (*)
! MODULE PROCEDURE vekmult
! END INTERFACE
TYPE content
INTEGER:: idx
REAL:: wert
END TYPE content
TYPE node
TYPE(content):: komponente
TYPE(node), POINTER:: next => NULL()
END TYPE node
TYPE sparsevektor
PRIVATE
TYPE(node), POINTER:: head=> NULL()
END TYPE
CONTAINS
SUBROUTINE lesevektor(vek)
INTEGER:: i
REAL:: v
TYPE(sparsevektor), INTENT(INOUT):: vek
TYPE(node), POINTER:: tmp, new, tail
i=1
DO
READ(*,*) i,v
IF(i>0) THEN
ALLOCATE(new)
new%komponente%idx=i
new%komponente%wert=v
IF (.not. associated(vek%head)) THEN
vek%head=> new
tail => new
ELSE
tmp => vek%head
vek%head => new
vek%head%next => tmp
END IF
ELSE
EXIT
END IF
END DO
END SUBROUTINE lesevektor
SUBROUTINE WRITEVEK(vek)
TYPE(sparsevektor), INTENT(IN):: vek
TyPE(node), POINTER:: tmp
tmp => vek%head
DO WHILE (ASSOCIATED(tmp))
WRITE(*,*) tmp%komponente%idx, tmp%komponente%wert
tmp => tmp%next
END DO
END SUBROUTINE WRITEVEK
! REAL FUNCTION(x,y)
! TYPE(sparsevektor), INTENT(in)::x,y
! REAL:: z
END MODULE sparse
PROGRAM vektor
USE sparse
IMPLICIT NONE
TYPE(sparsevektor):: vv
CALL lesevektor(vv)
CALL WRITEVEK(vv)
END PROGRAM vektor
我之前评论的意思是:
MODULE sparse
IMPLICIT NONE
! INTERFACE OPERATOR (*)
! MODULE PROCEDURE vekmult
! END INTERFACE
TYPE content
INTEGER:: idx
REAL:: wert
END TYPE content
TYPE node
TYPE(content):: komponente
TYPE(node), POINTER:: next => NULL()
END TYPE node
TYPE sparsevektor
PRIVATE
TYPE(node), POINTER:: head=> NULL()
END TYPE
CONTAINS
SUBROUTINE lesevektor(vek)
INTEGER:: i
REAL:: v
TYPE(sparsevektor), INTENT(INOUT):: vek
TYPE(node), POINTER:: tmp, new, tail
i=1
DO
READ(*,*) i,v
IF(i>0) THEN
ALLOCATE(new)
new%komponente%idx=i
new%komponente%wert=v
IF (.not. associated(vek%head)) THEN
vek%head=> new
tail => new
ELSE
tail%next => new ! ==> new
tail => new ! ==> new
!tmp => vek%head ! ==> old
!vek%head => new ! ==> old
!vek%head%next => tmp ! ==> old
END IF
ELSE
EXIT
END IF
END DO
END SUBROUTINE lesevektor
SUBROUTINE WRITEVEK(vek)
TYPE(sparsevektor), INTENT(IN):: vek
TyPE(node), POINTER:: tmp
tmp => vek%head
DO WHILE (ASSOCIATED(tmp))
WRITE(*,*) tmp%komponente%idx, tmp%komponente%wert
tmp => tmp%next
END DO
END SUBROUTINE WRITEVEK
! REAL FUNCTION(x,y)
! TYPE(sparsevektor), INTENT(in)::x,y
! REAL:: z
END MODULE sparse
PROGRAM vektor
USE sparse
IMPLICIT NONE
TYPE(sparsevektor):: vv
CALL lesevektor(vv)
CALL WRITEVEK(vv)
END PROGRAM vektor
我正在尝试将稀疏向量实现为 Fortran95 中的链表。列表节点具有索引和组件值。当我尝试将向量保存为列表时,头部最终指向添加的最后一个节点,我似乎无法让它指向 "smallest index"
我想要的是我的列表结尾是这样的
head => node1 => node2 => node3 => NULL
我目前得到的(来自输出)
head=> node3 => node 2 => node 1
MODULE sparse
IMPLICIT NONE
! INTERFACE OPERATOR (*)
! MODULE PROCEDURE vekmult
! END INTERFACE
TYPE content
INTEGER:: idx
REAL:: wert
END TYPE content
TYPE node
TYPE(content):: komponente
TYPE(node), POINTER:: next => NULL()
END TYPE node
TYPE sparsevektor
PRIVATE
TYPE(node), POINTER:: head=> NULL()
END TYPE
CONTAINS
SUBROUTINE lesevektor(vek)
INTEGER:: i
REAL:: v
TYPE(sparsevektor), INTENT(INOUT):: vek
TYPE(node), POINTER:: tmp, new, tail
i=1
DO
READ(*,*) i,v
IF(i>0) THEN
ALLOCATE(new)
new%komponente%idx=i
new%komponente%wert=v
IF (.not. associated(vek%head)) THEN
vek%head=> new
tail => new
ELSE
tmp => vek%head
vek%head => new
vek%head%next => tmp
END IF
ELSE
EXIT
END IF
END DO
END SUBROUTINE lesevektor
SUBROUTINE WRITEVEK(vek)
TYPE(sparsevektor), INTENT(IN):: vek
TyPE(node), POINTER:: tmp
tmp => vek%head
DO WHILE (ASSOCIATED(tmp))
WRITE(*,*) tmp%komponente%idx, tmp%komponente%wert
tmp => tmp%next
END DO
END SUBROUTINE WRITEVEK
! REAL FUNCTION(x,y)
! TYPE(sparsevektor), INTENT(in)::x,y
! REAL:: z
END MODULE sparse
PROGRAM vektor
USE sparse
IMPLICIT NONE
TYPE(sparsevektor):: vv
CALL lesevektor(vv)
CALL WRITEVEK(vv)
END PROGRAM vektor
我之前评论的意思是:
MODULE sparse
IMPLICIT NONE
! INTERFACE OPERATOR (*)
! MODULE PROCEDURE vekmult
! END INTERFACE
TYPE content
INTEGER:: idx
REAL:: wert
END TYPE content
TYPE node
TYPE(content):: komponente
TYPE(node), POINTER:: next => NULL()
END TYPE node
TYPE sparsevektor
PRIVATE
TYPE(node), POINTER:: head=> NULL()
END TYPE
CONTAINS
SUBROUTINE lesevektor(vek)
INTEGER:: i
REAL:: v
TYPE(sparsevektor), INTENT(INOUT):: vek
TYPE(node), POINTER:: tmp, new, tail
i=1
DO
READ(*,*) i,v
IF(i>0) THEN
ALLOCATE(new)
new%komponente%idx=i
new%komponente%wert=v
IF (.not. associated(vek%head)) THEN
vek%head=> new
tail => new
ELSE
tail%next => new ! ==> new
tail => new ! ==> new
!tmp => vek%head ! ==> old
!vek%head => new ! ==> old
!vek%head%next => tmp ! ==> old
END IF
ELSE
EXIT
END IF
END DO
END SUBROUTINE lesevektor
SUBROUTINE WRITEVEK(vek)
TYPE(sparsevektor), INTENT(IN):: vek
TyPE(node), POINTER:: tmp
tmp => vek%head
DO WHILE (ASSOCIATED(tmp))
WRITE(*,*) tmp%komponente%idx, tmp%komponente%wert
tmp => tmp%next
END DO
END SUBROUTINE WRITEVEK
! REAL FUNCTION(x,y)
! TYPE(sparsevektor), INTENT(in)::x,y
! REAL:: z
END MODULE sparse
PROGRAM vektor
USE sparse
IMPLICIT NONE
TYPE(sparsevektor):: vv
CALL lesevektor(vv)
CALL WRITEVEK(vv)
END PROGRAM vektor