Sei sulla pagina 1di 9

LE LISTE

Una lista una struttura dati ricorsiva ,ovvero formata da elementi dello stesso tipo e collegati tra
di loro, la cui lunghezza pu variare dinamicamente.

I suoi elementi sono variabili dinamiche che vengono creati o cancellati producendo una struttura
dati che cresce o diminuisce a secondo delle esigenze del programmatore.

A differenza delle rappresentazioni sequenziali in cui gli elementi sono memorizzati a una distanza
fissa, nelle liste a puntatori questi elementi possono essere posti in un qualsiasi punto della
memoria.

Per accedere agli elementi nella lista in ordine corretto con ciascun elemento, memorizziamo
lindirizzo dellelemento successivo in questa lista. Questo puntatore detto link. Il LINK fa si che
tutti i nodi della lista siano collegati tra di loro. Ogni nodo formato sempre da 2 o pi campi , uno
contenente i dati e laltro contenente il puntatore .

Per rappresentare una lista a puntatori possiamo usare due array monodimensionale : uno
contenente il dato e un array parallelo di supporto che contiene il link ovvero il collegamento al
nodo successivo.

Es. di NODO

INDICE DATA LINK

I DATA(I) LINK(I)

ORA VOGLIAMO CONSIDERARE LA SEGUENTE LISTA CONTENENTE TUTTE LE PAROLE INGLESI


TERMINANTI IN AT.

QUESTE SONO DISPOSTE IN ORDINE CASUALE NELLA NOSTRA LISTA A PUNTATORI.


.

6 BAT 8

8 CAT 9
9 EAT 11
10
11 HAT 14

14 JAT 20
6

20 MAT 31

31 OAT 32
32 PAT 40

40 RAT 41
41 SAT 42
42 TAT 43
43 VAT 44
44 WAT 0

Come possiamo vedere gli elementi della lista sono disposti in ordine casuale ma questi sono
collegati tra di loro tramite il LINK che ci segnala qual il prossimo nodo contenente un dato.

Es .

La lista parte in DATA(6)=BAT, ora il LINK(6) ha valore 8, ovvero punta a DATA(8) che contiene
CAT e il LINK(8) ci manda a DATA(9) che contiene la parola EAT e cos via fino a quando il LINK(I)
sar uguale a 0 .

Quando il LINK(I)=0 non ci sono pi elementi nella lista.


Si soliti rappresentare le liste a puntatori come una sequenza ordinata di NODI con i puntatori
rappresentati da frecce.

Per fare ci abbiamo bisogno di un nodo sentinella che contiene:

TLP : TOP LISTA PIENA


TLP TLV
TLV : TOP LISTA VUOTA

In questo caso TLP= 6 ( OVVERO IL PRIMO NODO CONTENETE UN DATO)

E TLV= 1 ( OVVERO IL PRIMO NODO VUOTO)

E solito immaginare la nostra lista divisa in due liste diverse e separate:

una contenente tutti i nodi pieni e una contenente tutti i nodi vuoti.

6 8 9 11 14 20 31

BAT 8 CAT 9 EAT 11 HAT 14 JAT 20 MAT 31 OAT 0

Questa lista contiene tutti i nodi pieni della nostra lista iniziale e il TLP=6 ovvero lindice del primo
nodo pieno

1 2 3 4 5 7 10

2 3 4 5 7 10 0

Questa lista invece contiene tutti i nodi vuoti della nostra lista iniziale e il TLV= 1 ovvero lindice del
primo nodo vuoto
Ora passiamo a vedere come si crea una lista.

Quando noi creiamo una lista questa sar del tutto vuoto ovvero priva di elementi quindi avremo
una lista di questo genere : TLP TLV

0 1

1 2 3 4 5 6 7

2 3 4 5 6 7 0

Visto che la lista del tutto vuota TLV andr a puntare il primo nodo creato.

E i link dei noi andranno a puntare sempre al nodo successivo finch I=N-1, e il link dellultimo
nodo sar uguale a 0 il che ci indicher che la lista si chiude in quel punto .

INIZIO

DARE numero nodi; N

I=0

RIPETI

I=I+1

DATA(I)=*

LINK(I)=I+1

FINCHE I=N-1

LINK(N)=0

TLP=0

TLV=1

FINE
Le operazioni principali che possiamo svolgere sulle liste sono 2 :

INSERIMENTO : IN TESTA, AL CENTRO, IN CODA

CANCELLAZIONE : IN TESTA, AL CENTRO, IN CODA

NOI ANDREMO AD ANALIZZARE LINSERIMENTO IN TESTA

PRENDEREMO COME ESEMPIO QUESTA LISTA.

TLP TLV

1 2

1 4 6 7

10 4 14 6 18 7 20 0

2 3 5

3 5 0

Come prima cosa dobbiamo verificare se abbiamo disponibili dei nodi vuoti e per fare ci
controlliamo il nostro TLV:

SE TLV=0 ALLORA LA NOSTRA LISTA SARA DEL TUTTO PIENA E CI SARA IMPOSSIBILE FARE
LINSERIMENTO.

Se il nostro TLV diverso da 0 allora possiamo procedere allinserimento in testa.

Come prima cosa facciamo la GETNODE. La GETNODE un processo che ci stacca il primo nodo
della lista vuota e ce lo porta in memoria aggiornando il nuovo TLV e aggiungendo il dato da
inserire nel nodo vuoto
X=TLV

Dare nome da inserire; NO

DATA(X)= NO

TLV= LINK(TLV)

1 4 6 7

10 4 14 6 18 7 20 0

2 3 5

3 5 0

TLP=1

TLV=LINK(TLV) TLV= 3
7 3

3
Nel nostro caso il nodo 2 viene staccato dalla lista e viene portato in memoria e il nostro nuovo
TLV uguale al link del vecchio TLV ovvero 3 e inseriamo nella casella DATA(x) ovvero DATA(2) il
valore che vogliamo inserire, in questo caso 7 .

Ora dobbiamo portare il nuovo in testa alla lista. Il processo che ci restituisce il nuovo nodo che si
trova in memoria consiste nel trasportare il nuovo nodo in testa alla lista aggiornando il link del
nuovo nodo e aggiornando il TLP.

LINK(X)=TLP

TLP=X
2 1 4 6 7

7 1 10 4 14 6 18 7 20 0

7 3

3
2 3 5

3 5 0

TLP=X TLP= 2

TLV= 3

ALLA FINE NOI AVREMMO DI QUESTI PASSQGGI AVREMMO AGGIUNTO SIA IL NODO IN TESTA
ALLA NOSTRA LISTA E AVREMMO ANCHE AGGIORNATO IL TLP E IL LINK DEL NOSTRO PRIMO
NODO.

2 1 4 6 7

7 1 10 4 14 6 18 7 20 0

3
3 5 TLP=2 TLV=3

5 0
INIZIO

LEGGI TLV
SE TLV=0 ALLORA
ERRORE LISTA PIENA !!!
ALTRIMENTI
X=TLV
DARE NOME DA INSERIRE; NO
DATA(X)= NO
TLV=LINK (TLV)
LINK(X)= TLP
TLP=X
FINE SE
FINE

PASTORE CARMINE 4DS