不管我们用指针指向什么类型的数据,计算机总会给指针配置相同的内存空间,比如说,我们用指针指向自定义的数据类型时,如果交换这个类型,会用到很大的内存空间,但如果只是用指针来进行交换的话,就会使用较少的内存空间。
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啦,今晚昆仑神宫,追剧去也!!!