【发布时间】:2018-08-01 10:22:20
【问题描述】:
我正在尝试在 Fortran95 中将稀疏向量实现为链表。 List 节点具有索引和组件值。当我尝试将向量保存为列表时,头部最终指向添加的最后一个节点,我似乎无法让它指向“最小索引”
我想要的是我的列表的结尾看起来像这样
head => node1 => node2 => node3 => NULL
我目前得到的(从输出)
head=> 节点 3 => 节点 2 => 节点 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
【问题讨论】:
-
为什么在
if部分中有tail而不是else部分? (什么都没试过)。 -
我尝试使用tail,但最后只添加了第一个和最后一个节点,中间的所有内容都以某种方式丢失了lol
标签: linked-list fortran fortran95