Fortran学习17:指针3

不管我们用指针指向什么类型的数据,计算机总会给指针配置相同的内存空间,比如说,我们用指针指向自定义的数据类型时,如果交换这个类型,会用到很大的内存空间,但如果只是用指针来进行交换的话,就会使用较少的内存空间。

module f
    type person
        character(len=20)::name
        real::height,weight
    end type 
    type pperson
        type(person),pointer::p
    end type
    contains
    subroutine sort(p)
        implicit none
        type(pperson) :: p(:)
        type(pperson)::temp
        integer i,j,s
        s=size(p, dim=1)
        do i=1,s-1
            do j=i+1,s
                if((p(j)%p%height<p(i)%p%height))then
                    temp=p(i)
                    p(i)=p(j)
                    p(j)=temp
                end if
            end do 
        end do 
    return 
    end subroutine
end module
program main
    use f
    implicit none

    type(person),target::p(5)=(/person("chen",180.0,75.0),&
                                person("huang",170.0,65.0),&
                                person("liu",175.0,80.0),&
                                person("cai",182.0,78.0),&
                                person("xv",178.0,70.0)/)
    type(pperson) :: pt(5)
    integer i
    forall(i=1:5)
        pt(i)%p=>p(i)
    end forall
    CALL sort(pt)
    write(*,"(5(A8,F6.1,F5.1/))")(pt(i)%p,i=1,5)
    stop 
end 

其实和c++、java的指针一样,Fortran的指针除了间接使用便量,作为可变大小数组使用之外,还有一个非常重要的作用就是创建各种数据结构:串行(线性)、树状结构等。

最主要的一个应用就是用来解决动态使用内存的问题。

第一个单向串行,我看了看,这个直接就是做一个单链表嘛,不用看书上怎么写了,直接自己写。

module typedef
    type LinkNode
        integer::number
        type(LinkNode),POINTER::next
    end type
end module
program main
    use typedef
    implicit none
    type(LinkNode),pointer::p,head
    type(LinkNode), pointer ::pt
    integer::i,size,number1,err
    write(*,*)"input number of list size"
    read(*,*)size
    allocate(head)
    head%number=1
    NULLIFY(head%next)
    p=>head
    do i=1,size
        allocate(p%next,stat=err)
        if(err/=0)then
        write(*,*)"out of memory!"
        stop
        end if
        write(*,*)"input a number of node"
        read(*,*)number1
        p%number=number1
        p=>p%next

    end do 
    NULLIFY(p%next)
    p=>head
    do while(.true.)
        write(*,"(I5)")p%number
        if(.not.ASSOCIATED(p%next))exit
        p=>p%next
    end do     
    stop "over" 
end 

直接就可以运行:

我觉得这就可以了,单链表完全结束,下午再写双链表和环形链表以及简单的插入和删除操作,Fortran还是很简单的,没啥大意思,只要之前用c++写过数据结构,那Fortran的数据结构就没啥大问题。

来一个双链表:

module typedef
    implicit none
    type::LinkNode
        integer::i
        type(LinkNode),POINTER::pre
        type(LinkNode),POINTER::next
    end type
end module
program main
    use typedef
    implicit none
    type(LinkNode),POINTER::p
    type(LinkNode),TARGET::node1,node2,node3
    integer,PARAMETER::s=6
    integer::i
    node1=LinkNode(1,null(),node2)
    node2=LinkNode(2,node1,node3)
    node3=LinkNode(3,node2,NULL())
    stop "over"
end program 

好了,之后的输出之类的活,直接迁移上面单链表的代码就行,至于之后的环形链表,更简单了,变成一个环就行,没啥写的必要了,到这链表就结束了,树形结果也差不多,只要有一定的数据结构基础,我相信写起来没啥意思。

ok啦,今晚昆仑神宫,追剧去也!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值