MODULE LISTNODE
  TYPE NODE
     INTEGER              :: INFO
     TYPE (NODE), POINTER :: NEXT
  END TYPE NODE
END MODULE LISTNODE

PROGRAM LISTSAMPLE2
  USE LISTNODE
  IMPLICIT NONE
  TYPE (NODE), POINTER  :: HEAD
  INTEGER NUMNODE
  ! we include the interface for TREEPRINT here
  INTERFACE
     RECURSIVE SUBROUTINE LISTPRINT(T)
       USE LISTNODE
       TYPE (NODE), POINTER :: T
     END SUBROUTINE LISTPRINT
     RECURSIVE FUNCTION GENLIST(N, NUMNODE) RESULT (T)
       USE LISTNODE
       TYPE (NODE), POINTER :: T
       INTEGER N, NUMNODE
     END FUNCTION GENLIST
  END INTERFACE
  ! (* initialization *)
  NUMNODE = 0
  HEAD => GENLIST(8,NUMNODE)
  CALL LISTPRINT(HEAD)
END PROGRAM LISTSAMPLE2

!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!*       F U N C T I O N   G E N T R E E                   *
!       This generates a tree.  n is a small positive integer
!	specifying an upper bound on the number of nodes
!	of the tree.  The nodes can have two children, and
!	an information field.  The information field is 
!*      given a sequential node number.                    *
!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
RECURSIVE FUNCTION GENLIST(N, NUMNODE) RESULT (T)
  USE LISTNODE
  IMPLICIT NONE
  INTEGER N, NUMNODE
  TYPE (NODE), POINTER ::T
  ALLOCATE(T)
  NUMNODE=NUMNODE+1 !numnode is the unique number
  !stored in each node after its creation
  T%INFO = NUMNODE
  IF (N<=1) THEN
     NULLIFY(T%NEXT)
  ELSE      
     T%NEXT => GENLIST(N-1,NUMNODE)
  END IF
END FUNCTION GENLIST

!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
!*      S U B R O U T I N E    L I S T P R I N T         *
!*	The information fields of the nodes of a tree
!	are printed so that the tree is rotated 90 degrees
!	counter-clockwise.  The nodes are given proper 
!*	depths.                                          *
!* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
RECURSIVE SUBROUTINE LISTPRINT(T)
  USE LISTNODE
  IMPLICIT NONE
  TYPE (NODE), POINTER :: T
  INTEGER I
  IF (ASSOCIATED(T)) THEN
     WRITE(6,*) T%INFO
     CALL LISTPRINT(T%NEXT)
  END IF
END SUBROUTINE LISTPRINT

