01.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

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..........

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

Saved successfully!

Ooh no, something went wrong!