⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btree.f90

📁 fortran 95书的源程序全集
💻 F90
字号:
!
! 二元树排序范例
!
module typedef
  implicit none
  type :: data
    integer :: n       ! 存放的数据	
    integer :: repeat  ! 数据重覆的次数
    type(data), pointer :: left  ! 左枝
    type(data), pointer :: right ! 右枝
  end type data
end module typedef

module bin_tree
  use typedef
  implicit none
  private
  type(data), pointer :: tree, action  
  integer, save :: numbers = 0
  public add, TraceTree
contains
!
! 新加入一条数据
!
subroutine add( n )
  implicit none
  integer, intent(in) :: n
  integer :: err
  type(data), pointer :: new
  integer :: level
  level=1
  numbers=numbers+1
  write(*, '(1x,a5,i4,a8)' ) "Get :",numbers," numbers"
  ! 配置一块新的空间
  allocate( new, stat=err )
  if ( err/=0 ) then
    write(*,*) "Out of memory!"
    stop
  end if

  write(*,"('root ')", advance="NO")
  ! 设定数据
  new%repeat=1
  new%n=n
  nullify( new%right, new%left )
  ! 如果是第一条数据
  if ( numbers==1 ) then
    action=>new
    tree=>new
    write(*,"(': new')")
    return
  end if
  
  action=>tree

  do while( .true. )
    level=level+1
	! 数据大于目前枝干的数值时
    if ( n>action%n ) then
      if ( associated( action%right ) ) then
        action=>action%right  ! 再向右去寻找立身处
		write(*, "('->R')", advance="NO")
      else
        action%right=>new  ! 建立新的右枝 
        action=>new
		write(*, "('->R: new')")
        exit
      end if
    ! 数据小于目前枝干的数值时
    else if ( n<action%n ) then
      if ( associated( action%left ) ) then
        action=>action%left   ! 再向左去寻找立身处
		write(*, "('->L')", advance="NO")
      else
        action%left=>new  ! 建立新的左枝
        action=>new
		write(*, "('->L: new')")
        exit
      end if
   ! 数据等于目前枝干的数值时
    else if ( n==action%n ) then
      action%repeat=action%repeat+1  ! 把重覆的数目加1
      deallocate(new)  ! 可以不需要这个新的空间
      write(*, "(': Repeat')")
      return
    end if
  end do
  return
end subroutine add
!
! 显示排序的数据
!
subroutine TraceTree()
  implicit none
  call show_tree( tree )
  return
end subroutine TraceTree
!
! 排序数据的子程序
!
recursive subroutine show_tree( show )
  implicit none
  type(data), pointer :: show

  if ( associated( show ) ) then
     call show_tree( show%left )   ! 先取出左枝的数据
     call show_data( show )        ! 再取出目前位置的数据
     call show_tree( show%right )  ! 最后才取右枝的数据
  end if

  return
end subroutine show_tree
!
! 写出这个枝干所储存的数据
!
subroutine show_data( show )
  implicit none
  type(data), pointer :: show
  integer :: i

  do i=1,show%repeat
    write(*,*) show%n
  end do

  return
end subroutine show_data

end module bin_tree
!
! 主程序
!
program main
  use bin_tree
  implicit none
  integer num
  
  do while(.true.)
    write(*,*) "请输入整数, 输入0代表结束"
    read(*,*) num
	if ( num==0 ) exit
    call add(num)
  end do
  call TraceTree()

  stop
end program main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -