La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Programmazione Mod. B - prof. Burattini - Cap 17 1.

Presentazioni simili


Presentazione sul tema: "Programmazione Mod. B - prof. Burattini - Cap 17 1."— Transcript della presentazione:

1 Programmazione Mod. B - prof. Burattini - Cap 17 1

2 2 LISTE E PUNTATORI Una lista può essere vista come un array. Una lista può anche essere vista come una serie di elementi gli uni collegati agli altri attraverso un sistema di puntatori. Le strutture a,b,…., possono essere di type integer, stringa, record, etc. abcde

3 Programmazione Mod. B - prof. Burattini - Cap 17 3 Una linear linked list ( o lista legata lineare) è una collezione di variabili dinamiche formate da un campo item e un campo puntatore. Ogni puntatore punta alla variabile successiva nellambito della struttura considerata. Pt P2 Luca P3Ugo ? P1 Emma nodo Variabile dinamicapuntatore itempuntatore Lista Ind. Mem Nome puntatore TypeNome Variabile valore PtrecPt^EmmaP P1recP1^LucaP P2recP2^UgoP3

4 Programmazione Mod. B - prof. Burattini - Cap 17 4 PxEmma ? Next Item Pt Stringa di 20 caratteri CONST NullItem= ' ' ;{controllo di eventuali errori } TYPE ItemType= STRING20[20] LNodeP=^LNodeType{puntatore a un nodo della lista} LNodeType = RECORD Item:ItemType; Next:LNodeP END; VAR Px:LNodeP; Questa è una eccezione rispetto allo standard del Pascal in cui si fa riferimento a un Type che precede e non che segue. Notare che lidentificatore LNodeP è definito prima del record dinamico LNodeType.

5 Programmazione Mod. B - prof. Burattini - Cap 17 5 Px P2 Luca P3Ugo NIL P1 Emma Item Next CONST NullItem= ' ' ;{controllo di eventuali errori } TYPE ItemType= STRING20[20] LNodeP=^LNodeType LNodeType = RECORD Item:ItemType; Next:LNodeP END; VAR Px:LNodeP; Px^.ItemEmma Px^.Next^.ItemLuca Px^.Next^.Next^.ItemUgo Px^.Next^.Next ^.Next^.NextNIL ItemNext

6 Programmazione Mod. B - prof. Burattini - Cap 17 6 ESERCIZIO Assegnata due liste legate L1 e L2 contenenti numeri interi, fondere le due liste in ununica lista in cui nella prima parte ci siano solo i numeri dispari e nella seconda parte solo i numeri pari. Es. L1=[2,5,1,6,8] L2=[12,3,10,7,9] L3=[5,1,3,7,9,2,6,8,12,10]

7 Programmazione Mod. B - prof. Burattini - Cap 17 7 LISTE GENERALIZZATE Vediamo come è possibile aggiungere o eliminare nodi dalla lista in un qualunque suo punto.

8 Programmazione Mod. B - prof. Burattini - Cap 17 8 CONST NullItem= ' ' ;{controllo di eventuali errori } TYPE ItemType= STRING[20] LNodeP=^LNodeType LNodeType = RECORD Item:ItemType; Next:LNodeP END; ListType = RECORD First:LNodeP END; VAR AList:ListType;

9 Programmazione Mod. B - prof. Burattini - Cap 17 9 PROCEDURE MakeList(VAR AList:ListType); {Crea una nuova lista vuota} PROCEDURE InsertNode(AnItem:ItemType; PrevNodeP:LNodeP; VAR AList:ListType); {Inserisce un Node con campo AnItem nella lista Alist. Il nodo è inserito subito dopo il nodo che ha come puntatore PrevNodeP. Se AListFirst=NIL allora il nodo sarà il primo della lista} PROCEDURE DeleteNode(PrevNodeP:LNodeP; VAR AList:ListType); {Cancella il Nodo che nella lista segue quello puntato da PrevNodeP. Se PrevNodeP è Alist.First, viene cancellato il primo nodo. Se la lista è vuota o PrevNodeP=NIL allora non succede nulla } CONST NullItem= ' ' ;{controllo di eventuali errori } TYPE ItemType= STRING[20] LNodeP=^LNodeType LNodeType = RECORD Item:ItemType; Next:LNodeP END; ListType = RECORD First:LNodeP END; VAR AList:ListType; NullItemNext First Alist ListType LNodeType Alist.First PROCEDURE KillNode(VAR Node:LNodeP); {Constructor :se Node non è NIL, dispose la memoria allocata per il Node e poi pone il Node a NIL. }

10 Programmazione Mod. B - prof. Burattini - Cap FUNCTION FirstNode(AList:ListType) :LNodeP; {ritorna il puntatore del primo nodo della lista } FUNCTION EmptyList(AList:ListType) :boolean; {ritorna TRUE se la lista è vuota } CONST NullItem= ' ' ;{controllo di eventuali errori } TYPE ItemType= STRING[20] LNodeP=^LNodeType LNodeType = RECORD Item:ItemType; Next:LNodeP END; ListType = RECORD First:LNodeP END; VAR AList:ListType; FUNCTION CercaPrevP(Px:LNodeP; AList:ListType):LNodeP; {dato il puntatore di un nodo Px fornisce il valore del puntatore del nodo che lo precede} FUNCTION Seleziona(AList:ListType;Index:integer):ItemType; {Fornisce il nome del nodo che si trova al posto Index} FUNCTION LPos(AList:ListType; SearchItem:ItemType):LNodeP; {Fornisce il puntatore di un preassegnato nodo SearchItem} NullItemNext First Alist ListType LNodeType Alist.First

11 Programmazione Mod. B - prof. Burattini - Cap CONST NullItem= ' ' ;{controllo di eventuali errori } TYPE ItemType= STRING[20] LNodeP=^LNodeType LNodeType = RECORD Item:ItemType; Next:LNodeP END; ListType = RECORD First:LNodeP END; VAR AList:ListType; PROCEDURE MakeList(VAR AList:ListType); {Crea una nuova lista vuota mettendo nei campi di First rispettivamente NullItem e NIL } BEGIN Alist.First:=NIL END; FUNCTION FirstNode(AList:ListType) :LNodeP; {ritorna il puntatore del primo nodo della lista } BEGIN FirstNode:=AList.First END; FUNCTION EmptyList(AList:ListType) :boolean; {ritorna TRUE se la lista è vuota } BEGIN EmptyList:=AList.First=NIL END; NullItemNext First Alist ListType LNodeType Alist.First PROCEDURE KillNode(VAR Node:LNodeP); BEGIN IF Node <> NIL THEN BEGIN dispose(Node); Node:=NIL END END;

12 Programmazione Mod. B - prof. Burattini - Cap AList.First NIL ItemNIL Temp AListFirst Item NextItem NextItem Next PrevNodeP Temp ItemNext PrevNodeP Item Next Item Next Item Next PrevNodeP ItemNext Temp PROCEDURE InsertNode(AnItem:ItemType;VAR PrevNodeP:LNodeP;VAR AList:ListType); {Inserisce un Node con campo AnItem nella lista Alist. Il nodo è inserito subito dopo il nodo che ha come puntatore PrevNodeP. Se PrevNodeP=NIL allora il nodo sarà il primo della lista} VAR Temp:LNodeP; BEGIN MakeNode(AnItem,Temp); IF PrevNodeP=NIL THEN BEGIN PrevNodeP:=Temp; Temp^.Next:=AList.First; AList.First:=Temp; END ELSE BEGIN Temp^.Next:=PrevNodeP^.Next; PrevNodeP^.Next:=Temp; PrevNodeP:=Temp; END;

13 Programmazione Mod. B - prof. Burattini - Cap Pseudo codice per cancellare un nodo Controllare se la lista è vuota. Controllare che non si cerchi di cancellare un puntatore che vale NIL. Cancellare il nodo indicato dal puntatore del nodo che lo precede, e far puntare questultimo sul nodo succesivo a quello da cancellare. AListFirst NullItem NextItem NextItem Next PrevNodeP Item Next

14 Programmazione Mod. B - prof. Burattini - Cap PROCEDURE DeleteNode(PrevNodeP:LNodeP;VAR AList:ListType); VAR Temp:LNodeP; BEGIN IF PrevNodeP<>NIL THEN Temp:=PrevNodeP^.Next { il nodo da cancellare non è il primo} ELSE Temp:=AList.First; { il nodo da cancellare è il primo} IF Temp<>NIL THEN IF PrevNodeP<>NIL THEN PrevNodeP^.Next:=Temp^.Next ELSE AList.First:=Temp^.Next; KillNode(Temp) END;

15 Programmazione Mod. B - prof. Burattini - Cap = <> AListFirst NullItem NextItem NextItem Next Item Next PrevNodeP <> NIL Temp= PrevNodeP^.Next Temp= Alist.First Potrebbe essere un qualunque nodo o lultimo nodo Temp <> NIL KillNode(Temp) = lista vuota Ultimo nodo PrevNodeP <> NIL <> Potrebbe essere un qualunque nodo o il primo della lista PrevNodeP.Next PrevNodeP^.Next:=Temp^.Next <> PrevNodeP E un nodo qualunque AList.First:=Temp^.Next = E il primo della lista

16 Programmazione Mod. B - prof. Burattini - Cap FUNCTION CercaPrevP(Px:LNodeP; VAR AList:ListType):LNodeP; {dato il puntatore di un nodo Px fornisce il valore del puntatore del nodo che lo precede} VAR CandP,Temp:LNodeP; BEGIN IF Px=AList.First THEN CercaPrevP:=NIL ELSE BEGIN CandP:=Alist.First; WHILE (CandP <> Px) AND (CandP<>NIL) DO BEGIN Temp:=CandP; CandP:=CandP^.Next END; CercaPrevP:=Temp END END;

17 Programmazione Mod. B - prof. Burattini - Cap Introduciamo due funzioni che permettono la gestione delle liste invece che attraverso i puntatori, attraverso la posizione dei singoli nodi nella lista. CONST NullItem= ' ' TYPE ItemType= STRING[20] LNodeP=^LNodeType LNodeType = RECORD Item:ItemType; Next:LNodeP END; ListType = RECORD First:LNodeP END; VAR AList:ListType; FUNCTION Ennesimo(P:LNodeP;n:integer):ItemType; {ricorsivamente cerca l'ennesimo elemento della lista} VAR AnItem:ItemType; BEGIN IF n=1 THEN BEGIN ItemValue(P,AnItem); Ennesimo:=AnItem; END ELSE Ennesimo:= Ennesimo(NextNode(P),n-1) {funzione ricorsiva} END; FUNCTION Seleziona(AList:ListType;Index:integer):ItemType; {Data una lista resituisce l'Item che si trova nella posizione Index} BEGIN IF Index<=0 THEN Seleziona:=NullItem ELSE Seleziona:=Ennesimo(AList.First^.Next,Index) END;

18 Programmazione Mod. B - prof. Burattini - Cap Introduciamo una funzione che permette la ricerca del puntatore di un nodo di cui è noto litem. FUNCTION LPos(List:ListType; SearchItem:ItemType):LNodeP; VAR CandNode: LNodeP; CandItem:ItemType; BEGIN CandNode:=FirstNode(List); {il primo item nella lista o NIL} ItemValue(CandNode,CandItem); WHILE (CandItem <> NullItem) AND (CandItem <> SearchItem) DO BEGIN CandNode:=NextNode(CandNode); ItemValue (CandNode,CandItem); END; IF CandItem=SearchItem THEN Lpos:=CandNode ELSE Lpos:=NIL ; END; Riscrivere questa funzione in forma ricorsiva

19 Programmazione Mod. B - prof. Burattini - Cap PROGRAM TestListe; VAR Lista:ListType; Nome,Nome2:ItemType; Indice:integer; Nodo,Nodo1, Px,PrevPx,LastNode:LNodeP; BEGIN writeln(' CREA LISTA'); MakeList(Lista); writeln; {Inserisci Dati} Nodo1:=Lista.First; writeln(' Dammi un nome'); readln(Nome); WHILE Nome<> NullItem DO BEGIN InsertNode(Nome,Nodo1,Lista); writeln(' Dammi un nome'); readln(Nome); END; writeln('Lista iniziale'); ShowList(FirstNode(Lista));

20 Programmazione Mod. B - prof. Burattini - Cap {CancellaNome} writeln(' Quale nome vuoi cancellare '); readln(Nome); writeln; Px:=Lpos(Lista,Nome); PrevPx:=CercaPrevP(Px,Lista); DeleteNode(PrevPx,Lista); writeln('Lista dopo la cancellazione'); ShowList(FirstNode(Lista)); readln; {InserisciRandom} writeln('Inserisci un nodo dopo l''item '); readln(Nome); writeln('Nuovo nodo '); readln(Nome2); Nodo1:=LPos(Lista,Nome); InsertNode(Nome2,Nodo1,Lista); writeln('Lista dopo inserimento di un nodo'); ShowList(FirstNode(Lista)); readln;

21 Programmazione Mod. B - prof. Burattini - Cap {CancellaPos} writeln('Cancella il nodo n. '); readln(Indice); Nome:=Seleziona(Lista,Indice); Px:=Lpos(Lista,Nome); PrevPx:=CercaPrevP(Px,Lista); DeleteNode(PrevPx,Lista); writeln('Lista dopo la cancellazione del nodo n. ',Indice); ShowList(FirstNode(Lista)); readln; END.

22 Programmazione Mod. B - prof. Burattini - Cap 17 22


Scaricare ppt "Programmazione Mod. B - prof. Burattini - Cap 17 1."

Presentazioni simili


Annunci Google