Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
lista in entrambi i versi, fermandosi al momento opportu- Come operare sulle liste<br />
no.<br />
Vediamo adesso quali siano i passi necessari per gestire<br />
In figura la è riportato un esempio di lista con due ele- una struttura a lista. Anzitutto, Exec ci fornisce le seguen-<br />
menti, disegnata sia nel modo in cui è realmente imple- ti funzioni:<br />
mentata, sia come possiamo immaginarla, per semplicità,<br />
con i due nodi fittizi. In figura lb è invece rappresentata AddHead(lista,nodo) aggiunge il nodo alla lista co-<br />
la lista vuota, anch'essa in entrambe le versioni. me primo elemento, cioè in testa;<br />
A questo punto vi chiederete dove è possibile memoriz-<br />
zare, nei nodi, le altre informazioni relative alla nostra<br />
applicazione. In effetti, la risposta a questa domanda<br />
consiste nel capovolgere i termini del problema: saranno<br />
le strutture da noi definite a dover contenere, come pri-<br />
mo campo, una delle due strutture nodo! Questa è infatti<br />
la convenzione adottata in tutte le liste di sistema e alla<br />
quale ci adegueremo.<br />
Tornando all'esempio del word processar, è sufficiente<br />
definire:<br />
struct Line {<br />
struct MinNode link;<br />
char *text;<br />
// Altri dati sulla linea<br />
per rendere la nostra struttura collegabile ad altre in una<br />
lista. A sua volta, il testo nella sua interezza è rappresen-<br />
tato dall'header:<br />
struct Text {<br />
struct MinList list;<br />
char *title;<br />
// Altri dati sul testo<br />
};<br />
11 Header<br />
I<br />
1 I Header Nodo Fittizio Nodo Fittizio<br />
Fiya Ib - Lista Vuota<br />
AddTail(lista,nodo) aggiunge il nodo alla lista come<br />
ultimo elemento, cioè in coda;<br />
Insert(lista, nodo, nodo-precedente) inserisce il nodo<br />
nella lista subito dopo il nodo-precedente;<br />
nodo = RemHead(1ista) rimuove dalla lista il nodo<br />
che si trova in testa e restituisce il suo puntatore; se<br />
la lista è vuota, restituisce NULL;<br />
nodo = RemTail(1ista) rimuove dalla lista il nodo che<br />
si trova in coda e restituisce il suo puntatore; se la li-<br />
sta è vuota. restituisce NULL.<br />
Remove(nodo) rimuove il nodo dalla lista in cui si<br />
trova, qualunque essa sia, e indipendentemente dalla<br />
sua posizione;<br />
dove lista è un puntatore a una struct List e nodo è un<br />
puntatore a una struct Node.<br />
Se vogliamo però usare le liste in modo agevole, abbia-<br />
mo bisogno di altre funzioni per inizializzare una lista,<br />
distinguere una lista vuota da una contenente degli ele-<br />
menti, ottenere il puntatore al primo e all'ultimo elemen-<br />
to e, soprattutto, percorrere la lista, cioè scandire i suoi<br />
elementi per fare una ricerca o per applicare una certa<br />
funzione agli elementi.<br />
Inoltre, per evitare valanghe di messaggi di warning da<br />
parte del nostro compilatore C, dobbiamo inserire tutti<br />
Nodo Fittizio<br />
Nodo Fittizio<br />
............... ", .. ...........,<br />
....... " ......, gli opportuni cast sui puntatori che passiamo alle funzio-<br />
..... ," ................... /,<br />
i/ IhJead ~/In-Succ.+.<br />
~ucc~~lh_~ail=KL~~<br />
.L I..........