Sunteți pe pagina 1din 16

STRUCTURI DINAMICE DE DATE

Liste unidirecionale Prelucrarea listelor unidirecionale

DEFINIII
O list n cadrul creia legtura ntre elemente se face sau este realizat cu ajutorul indicatorilor (pointerilor) se numete list nlnuit. Lista n care ordinea componentelor este determinat explicit de cmpurile de legtur a oricrui nod cu componentele din memorie se numete list nlnuit.

Listele sunt nite colecii omogene de elemente, cu o relaie liniar ntre elemente. Asta nseamn c fiecare element din list cu excepia primului, au un singur predecesor i un singur succesor n aceast list n afar de ultimul element. Ordinea elementelor n aa list adopt o funcie specific de accesare; n concluzie, dac lista este ordonat n cretere, succesorul fiecrui element din list este mai mare dect acest element.

STRUCTURA UNUI NOD DATA INFO LINK NEXT

TYPE TipDate = ; RefNod=^Nod Nod = RECORD INFO : TipDate; NEXT : RefNod; End;

VAR Lista : RefNod;

CREAREA UNEI LISTE


Lista Lista^
? ?

{1} NEW(Lista); {2} Lista^.Info:=Adam;


Lista

Lista^
Adam ?

Lista

Lista^
Adam ?

{3} NEW(NodNou);

NodNou

NodNou^
? ?

Lista

Lista^
Adam ?

{4} NodNou^.Info:=Boris;

NodNou

NodNou^
Boris ?

Lista

Lista^
Adam

{5} Lista^.Next:=NodNou;
NodNou NodNou^
Boris ?

CREAREA UNEI LISTE {6} Curent:=NodNou;


Lista Lista^
Adam

NodNou Curent
Lista^.Next
Boris ?

{7} NEW(NodNou);

NodNou

NodNou^
? ?

NodNou

NodNou^
Calin ?

{8} NodNou^.Info:=Calin;
Curent

{9} Curent^.Next:=NodNou;
Lista Lista^
Adam

Lista^.Next
Boris

NodNou

NodNou^
Calin ?

CREAREA UNEI LISTE {10} NodNou^.Next:=NIL;


Curent Lista Lista^
Adam

NodNou NodNou^
Calin NIL

Lista^.Next
Boris

{11} Curent:=NodNou;
Curent NodNout Lista Lista^
Adam

Lista^.Next
Boris

NodNou^
Calin NIL

PROCEDURA DE CREARE A UNEI LISTE Procedure CREARE; begin Write('Dati numarul de elemente n='); Readln(n); New(Lista); Curent:=Lista; Readln(Lista^.Info); nr:=1; Repeat New(NodNou); Readln(NodNou^.Info); Curent^.Next:=NodNou; Curent:=NodNou; Inc(nr); Until nr=n; Curent^.Next:=NIL; end;

PARCURGEREA UNEI LISTE Procedure TIPAR; begin Curent:=Lista; While Curent<>NIL do begin Write(Curent^.Info,' '); Curent:=Curent^.Next end; end;
Curent Lista
Adam Boris Calin NIL

INSERARE LA NCEPUT DE LISTA


Lista
Adam Boris Calin NIL

NodNou
Abel

NEW(NodNou); NodNou^.Info:=Item;

Lista
Adam Boris Calin NIL

NodNou
Abel

NodNou^.Next:=Lista;

INSERARE LA NCEPUT DE LISTA


Lista
Adam Boris Calin NIL

NodNou
Abel

Lista:=NodNou;

Lista
Abel Adam Boris Calin NIL

INSERARE LA NCEPUT DE LISTA

Procedure INSERTTOP(var Lista:RefNod; Item:Tip); Var NodNou:RefNod; begin NEW(NodNou); NodNou^.Info:=Item; NodNou^.Next:=Lista; Lista:=NodNou; end;

INSERAREA NTR-O POZIIE


Precedent Curent

Lista
Abel Adam Boris Calin NIL

Dac Item<Lista^.Info Atunci Insereaz_in_cap Altfel Creaz un Nod Nou; Pune Item n cmpul Info al Nodului Nou; PrecedentLista; Curent cmpul Next al Listei; Ct timp Item>Info al nodului Curent repet

Precedent Curent
Curent cmpul Next al lui Curent; sfct Insereaz Nodul Nou ntre Precedent i Curent;

att

ALGORITMUL DE INSERARE NTR-O POZIIE


Procedure INSERTPLACE(var Lista:RefNod; Item:Tip); Var Curent,Precedent,NodNou:RefNod; gasit:Boolean; Begin If Item<Lista^.Info Then INSERTTOP(Lista,Item) Else begin NEW(NodNou); NodNou^.Info:=Item; Precedent:=Lista; Curent:=Lista^.Next; gasit:=False; While (Curent<>NIL) AND NOT gasit do begin If Numar>Curent^.Info Then begin Precedent:=Curent; Curent:=Curent^.Next; end Else gasit:=True; end; NodNou^.Next:=Curent; Precedent^.Next:=NodNou; end; End;

ELIMINARE DIN CAPUL LISTEI


3

Lista
Abel Adam Boris Calin NIL

Temp
1

Item
Abel

Procedure DELETETOP(var Lista:RefNod; var Item:Tip); Var Temp:RefNod; begin Temp:=Lista; Item:=Lista^.Info; Lista:=Lista^.Next; Dispose(Temp); end;

ELIMINARE DIN ORICE POZIIE


Procedure DELETEPLACE(var ListaPtrNod;poz:Integer); Var i:Integer; Curent,Sterg:PtrNod; Begin If poz=1 Then DELETETOP(Lista) Else begin Curent:=Lista; i:=2; While i<>poz do begin Curent:=Curent^.Next; Inc(i); end; Sterg:=Curent^.Next; Curent^.Next:=Sterg^.Next; Dispose(Sterg); end; End;

DISTRUGERE LIST

Procedure DestroyList(Lista:PtrNod); Var Curent,Temp:PtrNod; Begin Curent:=Lista; While Curent<>Nil do begin Temp:=Curent; Curent:=Curent^.Next; Dispose(Temp); End; End;