You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
ADDHEAD(lista,nodo)<br />
ADDTAIL(lista,nodo)<br />
INSERT(lista,nodo,prec)<br />
nodo = FEMHEAD(lista,tipo)<br />
nodo = REMTAIL(lista,tipo)<br />
REMOVE(nodo)<br />
ENQUEUE(lista,nodo)<br />
nodo = FINDNAME(lista,nome,tipo)<br />
TabeUa l - Macro di 1iste.h e funzioni di Exec.<br />
AddHead<br />
AddTail<br />
Insert<br />
RemHead<br />
RemTail<br />
Remove<br />
Enqueue<br />
FindName<br />
Sul disco allegato ad <strong>Amiga</strong> <strong>Magazine</strong> troverete il file li-<br />
ste.h, contenente un insieme di macro che semplifica<br />
l'uso delle liste.<br />
I1 primo gruppo di macro ricalca le funzioni di Exec e si<br />
occupa esclusivamente di eseguire i cast; potete fare rife-<br />
rimento alla tabella 1 per le corrispondenze (ovvie, visti i<br />
nomi!) tra macro e funzioni, tenendo presente che il<br />
comportamento di ogni macro è analogo a quello della<br />
relativa funzione. Notiamo che le macro che restituiscono<br />
un puntatore hanno un argomento in più rispetto alla<br />
corrispondente funzione: si tratta del tipo del nodo da<br />
noi definito.<br />
I1 secondo gruppo di macro è riassunto in tabella 2, ove<br />
compare anche una breve descrizione del loro significa-<br />
INITLIST(1ista) Inizializza la lista prima dell'uso<br />
ISEMPTY(1ista) Verifica se la lista è vuota<br />
ISHEAD(nod0) Verifica se il nodo è il nodo fittizio di testa<br />
ISTAIL(nod0) Verifica se il nodo è il nodo fittizio di coda<br />
ISFIRST(nodo) Verifica se il nodo è il primo della lista<br />
ISLAST(nodo) Verifica se il nodo è l'ultimo della lista<br />
Qualche esempio<br />
Per creare una lista si dovrà anzitutto dichiarare una va-<br />
riabile di tipo struct Text, che sarà I'header della lista.<br />
Come si può vedere dalla figura lb, anche quando la li-<br />
sta è vuota, i campi dell'header devono essere opportu-<br />
namente inizializzati. Pertanto, prima di qualunque altra<br />
operazione, è necessario utilizzare la macro INITLIST( ).<br />
Questa macro è analoga alla funzione NewList( ) conte-<br />
nuta nella libreria linked amiga.lib.<br />
Dal momento che la tecnica d'uso delle liste è basata<br />
sull'allocazione dinamica della memoria, prima di inserire<br />
un nuovo elemento si dovrà provvedere ad allocare la<br />
giusta quantità di memoria ed eventualmente a inizializ-<br />
zarne i campi relativi alla nostra applicazione.<br />
Viceversa, dopo la rimozione di un elemento da una li-<br />
sta, si dovrà rilasciare la memoria da esso occupata, se è<br />
nostra intenzione "distruggerlo"; altrimenti potrà essere<br />
inserito in un'altra lista (o nella stessa lista in un'altra po-<br />
sizione) o mantenuto isolato.<br />
Vi suggeriamo di scrivere delle funzioni per la creazione<br />
e la distruzione degli elementi della lista, prendendo<br />
spunto da quelle che trovate nel file di esempio 1iste.c.<br />
I1 seguente frammento di programma (di dubbia utilità!):<br />
struct Text testo;<br />
struct Line *lineal, *linea2;<br />
struct Line *linea;<br />
// Allocazione dinamica delle linee<br />
. . .<br />
nodo = HEAD(lista,tipo) Restituisce il primo nodo della lista<br />
nodo = TAIL(lista,tipo) Restituisce l'ultimo nodo della lista<br />
nodo = SUCC(nodo,tipo) Restituisce il nodo successore<br />
nodo = PRED(nodo,tipo) Restituisce il nodo predecessore<br />
TabeUa 2 - Altre macro di iiste.h.<br />
I 1<br />
I<br />
// Rilascio della memoria allocata<br />
...<br />
inizializza una lista, inserisce lineal in testa e linea2 in<br />
coda, quindi estrae l'elemento che si trova in testa, assegnandone<br />
- l'indirizzo a linea (abbiamo omesso il codice<br />
relativo alla creazione dinamica e al rilascio delle due<br />
struct Line alle quali devono puntare linea1 e linea2).