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.

388 Puntatori<br />

Uno dei vantaggi che si ha lavorando con liste concatenate consiste nel fatto che la memoria<br />

allocata può immediatamente essere liberata quando non più necessaria. Questa operazione<br />

può essere facilmente effettuata attraversando la lista e deallocandone tutti i nodi, nello stesso<br />

modo con cui essi sono stati processati per essere sottoposti a stampa:<br />

! Attraversamento della lista e deallocazione dei nodi<br />

current => list ! current punta alla testa della lista<br />

DO<br />

IF (.NOT.ASSOCIATED(current)) EXIT ! esce quando raggiunge la coda<br />

list => current%next ! list punta al successivo nodo di testa<br />

DEALLOCATE(current) ! dealloca il corrente nodo di testa<br />

current => list ! current punta al nuovo nodo di testa<br />

END DO<br />

Un pratico esempio di utilizzo di liste concatenate può essere concepito, ad esempio, per l’ordinamento<br />

di un elenco di valori secondo il meccanismo di ordinamento per inserzione (insertion<br />

sort) il quale, come è noto, viene utilizzato per la costruzione di una lista ordinata all’atto della<br />

generazione della lista stessa. L’algoritmo in esame lavora inserendo ciascun valore, appena<br />

questo viene letto, nella posizione che gli compete nella lista. In particolare, se tale valore è<br />

minore di tutti i valori precedentemente immagazzinati nella lista, esso verrà inserito in testa<br />

alla lista; al contrario, se è maggiore di tutti gli elementi della lista esso verrà posizionato in<br />

coda alla lista; infine, se questo valore si colloca in una posizione, per così dire, intermedia esso<br />

verrà inserito nella idonea posizione a(j) facendo preliminarmente avanzare di una posizione<br />

tutti gli elementi della sottosequenza ordinata a(j), a(j + 1), ...a(n). Ebbene, si noti che se<br />

la lista in oggetto fosse implementata a mezzo di un array, l’inserimento di un qualsiasi elemento<br />

all’interno della lista comporterebbe uno spostamento ”fisico” di intere sezioni di array.<br />

L’impiego, invece, di liste concatenate fornisce una valida soluzione per definire una relazione<br />

di ordinamento tra gli elementi evitando di procedere ad un riordinamento fisico degli stessi.<br />

Quanto detto è efficacemente descritto dal seguente programma:<br />

PROGRAM inserzione<br />

!<br />

! Scopo: Leggere una serie di valori reali da un file di dati<br />

! organizzarli secondo il procedimento di ordinamento<br />

! per inserzione. Una volta ordinati, gli elementi<br />

! della lista vengono prodotti in stampa.<br />

!<br />

! *** Sezione dichiarativa ***<br />

IMPLICIT NONE<br />

TYPE :: int_value<br />

REAL :: value<br />

TYPE(int_value),POINTER :: next_value<br />

END TYPE<br />

TYPE(int_value), POINTER :: head ! puntatore alla testa della lista

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

Saved successfully!

Ooh no, something went wrong!