PROGRAM Test_Lista
!----------------------------------------------------------------------
! Programma di test delle operazioni primitive su liste
!----------------------------------------------------------------------
  USE Primitive_Lista
!   Associa il modulo Primitive_Lista, acquisendo tutte le definizioni
!   ivi contenute.
!   USE va obbligatoriamente inserita prima di qualunque altra
!   istruzione dell'unità di programma.
!   Il modulo deve essere stato compilato in precedenza.

  IMPLICIT NONE
  TYPE(cella),POINTER:: lis  ! Puntatore inziale (radice) della lista
!   Gli stati di un puntatore sono: associato, disassociato, indefinito.
!   Subito dopo la dichiarazione, lo stato e' indefinito.
  INTEGER :: e
!-- Creazione della lista
  NULLIFY(lis)  ! Inizializza la lista come "vuota"
!   L'istruzione NULLIFY disassocia uno (o eventualmente più) puntatori.
  WRITE(*,*) "Costruisco una lista"
  WRITE(*,*) "Dammi di seguito degli interi, uno per riga"
  WRITE(*,*) "Il numero 999 termina i dati "
  DO
    READ(*,*) e
    IF (e==999) EXIT
    CALL Cons(e,lis)
  END DO
!-- Stampa della lista
  WRITE (*,*) "Ecco la lista "
  CALL Stampa(lis)
!-- Cancellazione della lista
  WRITE(*,*) "Ora cancelliamo un elemento alla volta"
  DO
    IF (Null(lis))  EXIT
    WRITE(*,*) "Batti Invio"
    READ(*,*)
!     Lettura senza variabili, il progamma aspetta di ricere un "invio".
    e = Primo(lis)
    CALL Canc(lis)
    WRITE(*,*) e, " cancellato!"
  END DO
  STOP
END PROGRAM Test_Lista

