【问题标题】:Fortran keeping head pointing at first element / adding to tail of the listFortran 保持头部指向第一个元素/添加到列表的尾部
【发布时间】: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


【解决方案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
                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

【讨论】:

  • 我通过遍历列表来做到这一点,但你的方法是 O(1),这正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 2018-02-25
  • 1970-01-01
  • 2015-10-19
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多