Sunteți pe pagina 1din 8

CURSUL 5 1.

Liste simplu nlnuite


LSI ofer o relaie linear ntre elemente (noduri): fiecare nod (excepie primul) are un unic predecesor; fiecare nod (excepie ultimul) are unic succesor; accesul n lista se face doar prin primul element; deci e necesar un pointer la primul nod; toate legturile sunt n aceeai direcie. Concluzie unele operaii sunt dificil de implementat.

2. Liste circular nlnuite (LCI


!ef" O list LSI la care introducem ca succesor al ultimului nod pe primul nod !e"i sc#ema de!ine o L$I.

#$s. %. Se poate &muta' pointerul de nceput la oricare nod deci parcurgerea listei se poate face din orice nod; (. Se modific operaiile pentru c !aloarea (nil% &ULL nu mai exist; ). Legturile rm*n n aceeai direcie; +. ,nele operaii de!in mai simple dar altele rm*n dificile: Insert-efore .elete/t0osition .elete-efore 1e!erse.ispla2 0re!ious3lement.

'. Liste du$lu nlnuite (L!I


!ef" O list L.I este o list n care fiecare nod (excepie primul i ultimul) au legturi spre predecesor i succesor (!e"i sc#ema).

t(pedef struct nod ) *+ info, nod -prec% -urm, . &#!,

#$s. ,nele operaii de!in mai simple pentru L.I.

#peraia Insert/t0osition(L%p%e LSI


@creaz un nod n n.info e n.urm 7aflarea adresei lui p (pa) .ac (insert/fter(p) 8p9%) /tunci n.urm pa.urm pa.urm n Sf.ac // cazul p = primul nod // nu-i surprins

L!I
@creaz un nod n n.info e n.prec n.urm 7aflarea adresei lui p (pa) n.urm pa.urm pa.urm n :: leg la urm

n.prec (n.urm).prec :: leg la prec (n.urm).prec 8 n

0rocedure Insert1efore(L, p, e
.esc: insereaz elementul e in lista L naintea poziiei p 0re: L:List p:0ositia e:43 si !alid(L; p) 0ost: L5 este lista ce se o6ine din lista L dup inserarea naintea po"iiei p @creaz un nou nod n .ac p este poziia primului nod din lista L /tunci insereaz inaintea primului nod /ltfel caut nodul p% predecesorul lui p Insert/fter(L p% e) Sf.aca Sf 0rocedura

LSI
@creaz un nod n n.info e n.urm !ac p 8 % :: pa8cap /tunci n.urm cap cap n /ltfel 7 caut nodul p% predecesorul lui p Insert/fter(L p% e) Sf!aca

L!I
@creaz un nod n 7aflarea adresei lui p (pa) n.info e //pregatirea noului nod n n.urm n.prec Dac p = 1 :: pa8cap Atunci n.urm cap n.prec cap.prec //? Nu mai cap.prec n cap n Altfel n.prec pa.prec (pa.prec).urm n pa.prec n

n.urm
SfDac

pa

0rocedura delete(L, p
!esc" tergerea elementului de pe po"iia p pre" L : lista ; p : 0o"itia i !alid(L p) post" L5 este lista L dup tergerea elementului de pe po"iia p !ac p este poziia primului nod din list /tunci lista !a ncepe cu nodul successor al fostului prim nod /ltfel caut nodul p1 precedentul lui p delete/fter(L p%) Sf.aca Sf0rocedura

0rocedura delete(L, p LSI


7aflarea adresei lui p (pa)

L!I
7aflarea adresei lui p (pa) Dac p =1 // pa=cap Atunci cap pa.urm cap.prec pa.prec free pa Altfel (pa.prec).urm pa.urm (pa.urm).prec pa.prec free pa SfDaca

!ac p 8 % :: pa8cap /tunci cap pa.urm free pa /ltfel 7caut precedentul p1 al lui p delete/fter(l p%) Sf!ac

Comparaii /l2oritm Insert (after !elete(remo3e


/!anta;e: < .e"a!anta;e: <

LSI #(1 #(n

L!I #(1 #(n

Santinel
.ef: ,n o6iect !irtual utili"at pentru condiia s!mpt" In locul condiiilor : pa.urm= nil (ultimul nod) sau pa.prec=nil (primul nod) se utili"ea" un nod notat cu =IL i care repre"int nil dar are toate c*mpurile unui nod =IL.urm 8 primul nod din lista =IL.prec 8 ultimul nod al listei

Liste multiplu nlnuite (L4I


Nod = record info: TE link: array [max] of end int max =10; typedef struct nod { TE info; nod* p[max]; } N !; Liste ramificate +5emple" 9 4atrici rare 9 0olinoame 0(5%(%z 6 5'(2z 7 5'(7 5(27z 9 1 8 ar$ori.

Position

sau

typedef struct nod { TE info; nod *p,*st,*dr; } N !;

//Lista simplu inlantuita cu iterator #include <iostream.h> using namespace std; typedef int TE; class NOD pri!ate" TE #nf; NOD$ Leg;

// tipul TE este tipul intreg simplu int // informatia din nod // pointer spre urmatorul nod // constructor de alocare si // initiali+are // clasa L#-T. are acces pu%lic la clasa NOD // clasa #TE/.TO/ are acces pu%lic la // clasa NOD

pu%lic" NOD &TE inf' NOD$ leg()* #nf(inf; Leg(leg; , friend class L#-T.; friend class #TE/.TO/; ,; class L#-T. pri!ate" NOD$ 0ap; pu%lic" L#-T. &* 0ap(); , !oid .dd &TE*; friend class #TE/.TO/;

//constructor // clasa #TE/.TO/ are acces pu%lic la // clasa L#-T.

,; !oid L#-T."".dd &TE elem* if &0ap* NOD$ p(0ap; 1hile &p2>Leg* // parcurgerea listei p(p2>Leg; p2>Leg(ne1 NOD&elem')*; // adaugare dupa ultimul nod al listei , else 0ap(ne1 NOD&elem')*; // se crea+a primul nod al listei , class #TE/.TO/ pri!ate" NOD$ p; pu%lic" #TE/.TO/&L#-T.3 L* //constructor' &crea+a iteratorul si reset* p ( L.0ap; , TE operator &* &* return p2>#nf; , // elementul curent &4et0urent* !oid operator 55 &* p ( p2>Leg; , // a!ansea+a in lista &ne6t* int operator 7 &* return p7(); , // e6ista element &atEnd* !oid operator ( &TE e* // modificare element curent p2>#nf(e; , ,; !oid .fisare &L#-T. L* #TE/.TO/ i&L*; // declar iteratorul peste lista L 1hile &7i* // parcurgerea listei cout << i&* <<endl; // afisarea nodului curent i55; , , !oid main &!oid* L#-T. L; L..dd &88*; L..dd &9*; L..dd &8))*; L..dd &::*; cout<<;lista initiala";<<endl; .fisare&L*;

>

cout<<endl; int %ool; do #TE/.TO/ <&L*'=&L*; %ool(); =55; if &7=* do if &<&* > =&** TE au6; au6 ( <&*; < ( =&*; = ( au6; %ool( 8; , <55; =55; , 1hile &7=*; , 1hile &%ool*; cout<<;lista sortata";<<endl; .fisare&L*; cout<<endl; , // Lista Du%lu inlantuita /$ $ ListaD#.h $ $ 0reated on" >ar :)' 9)89 $ .uthor" ?asile 0io%an $/ #ifndef L#-T.D#@A@ #define L#-T.D#@A@ typedef int TE; class NOD pri!ate" TE #nf; NOD$ Brec; NOD$ Crm;

// tipul TE este tipul intreg simplu int // informatia din nod // pointer spre nodul precedent // pointer spre urmatorul nod

pu%lic" NOD &TE inf' NOD$ prec()' NOD$ urm()* // constructor de alocare si #nf(inf; // initiali+are Brec(prec; Crm (urm; , friend class LD#; // clasa L#-T. Du%lu #nlantuita are acces pu%lic la clasa NOD //friend class #TE/.TO/; // clasa #TE/.TO/ are acces pu%lic la clasa NOD ,; class LD# pri!ate" NOD$ 0ap; pu%lic" LD# &* //constructor 0ap(); , !oid .dd &TE*; !oid .fis &*; !oid Delete?al&TE*; !oid Delete.tBos&int*; int Length &*; // friend class #TE/.TO/; // clasa #TE/.TO/ are acces pu%lic la clasa LD# ,; /$

class #TE/.TO/ pri!ate" NOD$ p; pu%lic" #TE/.TO/&L#-T.3 L* p ( L.0ap; , TE operator &* &* return p2>#nf; , !oid operator 55 &* p ( p2>Leg; , int operator 7 &* return p7(); , !oid operator ( &TE e* p2>#nf(e; , ,; $/ #endif /$ L#-T.D#@A@$/ /$ $ ListaD#.cpp $ $ 0reated on" >ar :)' 9)89 $ .uthor" ?asile 0io%an $/ #include ;ListaD#.h; #include <iostream> using namespace std; int

//constructor' &crea+a iteratorul si reset* // elementul curent &4et0urent* // a!ansea+a in lista &ne6t* // e6ista element &atEnd* // modificare element curent

LD#""Length &* int 0ontor(); NOD$ pc(0ap; 1hile &pc2>Crm* 0ontor55; return 550ontor; , !oid LD#"".dd &TE elem* if &0ap* NOD$ pc(0ap; 1hile &pc2>Crm* pc(pc2>Crm; , pc2>Crm(ne1 NOD&elem'pc')*; , else 0ap(ne1 NOD&elem')')*; , !oid LD#"".fis &* NOD$ pc(0ap; 1hile &pc2>Crm* cout<<pc2>#nf<<; ;; pc ( pc2>Crm; , cout<<pc2>#nf; , !oid LD#""Delete?al&TE elem* NOD$ pc(0ap; 1hile &pc2>Crm 33 pc2>#nf 7( elem* pc ( pc2>Crm; , if &pc((0ap* &pc2>Crm*2>Brec(); 0ap(pc2>Crm; delete pc; , else

// parcurgerea listei // adaugare dupa ultimul nod al listei // se crea+a primul nod al listei

//afisarea ultimului nod

//daca elementul de sters e capul listei

if &pc2>Crm 33 pc2>#nf (( elem* // daca elem. de sters e interior &pc2>Crm*2>Brec(pc2>Brec; //se leaga nodurile din fata si din spate &pc2>Brec*2>Crm(pc2>Crm; delete pc; , else if&pc2>Crm(() 33 pc2>#nf((elem* //daca elem de sters e ultimul &pc2>Brec*2>Crm(); delete pc; , else cout<<;Dn;<<elem<<; negasit in lista;; //altfel nu e6ista in lista , , !oid LD#""Delete.tBos&int po+* NOD$ pc(0ap; int 0ontor(8; 1hile &pc2>Crm 33 0ontor<po+ * pc(pc2>Crm; 0ontor55; , if&7&pc2>Crm** else

//iesire sau pe ultimul sau pe nr de //ordine&0ontor((po+*

cout<<endl<<;lista prea scurta;;; cout<<; are doar;<<Length&*<<; elemente;<<endl; , if &po+((8* //daca elementul de sters e capul listei &pc2>Crm*2>Brec(); 0ap(pc2>Crm; delete pc; , else if &po+>8 33 po+<Length&** // daca elem. de sters e interior &pc2>Crm*2>Brec(pc2>Brec;//se leaga nodurile din fata si din spate &pc2>Brec*2>Crm(pc2>Crm; delete pc; , else if&po+ (( Length&** //daca elem de sters e ultimul &pc2>Brec*2>Crm(); delete pc; ,