25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

7.11 Strutture dati dinamiche 389<br />

CHARACTER(LEN=20) :: filename ! nome del file di dati di input<br />

INTEGER :: istat ! variabile di stato (0 = ok)<br />

INTEGER :: nvals = 0 ! numero di dati letti<br />

TYPE(int_value), POINTER :: ptr ! puntatore al nuovo valore<br />

TYPE(int_value), POINTER :: ptr1 ! puntatore temporaneo per la ricerca<br />

TYPE(int_value), POINTER :: ptr2 ! puntatore temporaneo per la ricerca<br />

TYPE(int_value), POINTER :: tail ! puntatore alla coda della lista<br />

REAL :: temp ! variabile temporanea<br />

! *** Sezione esecutiva ***<br />

WRITE(*,’(1X,A)’,ADVANCE=’NO’) "Nome del file di dati: "<br />

READ(*,’(A20)’) filename<br />

! Connessione del file di dati<br />

OPEN(UNIT=11,FILE=filename,STATUS=’OLD’,ACTION=’READ’,IOSTAT=istat )<br />

fileopen: IF (istat==0) THEN ! connessione avvenuta con successo<br />

! Dal momento che il file e’ stato connesso con successo, viene letto<br />

! il valore da ordinare, viene allocato spazio in memoria per esso,<br />

! viene individuata la posizione che gli compete nella lista e, quindi,<br />

! si procede al suo inserimento nella lista<br />

input: DO<br />

READ(11,*,IOSTAT=istat) temp ! lettura del valore<br />

IF (istat/=0) EXIT input ! esce per condizioni di fine-file<br />

nvals = nvals+1 ! contatore<br />

ALLOCATE(ptr,STAT=istat) ! alloca spazio per il nuovo nodo<br />

ptr%value = temp ! immagazzina il dato letto<br />

! Si valuta la posizione nalla lista dove inserire il nuovo valore<br />

new: IF (.NOT.ASSOCIATED(head)) THEN ! lista ancora vuota<br />

head => ptr ! posiziona il nuovo valore in testa<br />

tail => head ! la coda punta al nuovo valore<br />

NULLIFY (ptr%next_value) ! annulla il puntatore temporaneo<br />

ELSE ! Lista non vuota<br />

front: IF (ptr%value head<br />

head => ptr<br />

ELSE IF (ptr%value>=tail%value) THEN<br />

! Inserimento del valore in coda alla lista<br />

tail%next_value => ptr<br />

tail => ptr<br />

NULLIFY (tail%next_value)<br />

ELSE<br />

! Ricerca della posizione dove inserire il nuovo valore<br />

ptr1 => head<br />

ptr2 => ptr1%next_value

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!