170 likes | 534 Views
PROGRAMARE DINAMICĂ. LISTE LINIARE SIMPLU ÎNLĂNŢUITE. Declararea listelor Crearea listelor Operaţii cu liste Aplicaţii cu liste. Definirea unei liste de numere întregi t ype PNOD= ^NOD NOD= record info: integer; urm: PNOD; end;
E N D
PROGRAMARE DINAMICĂ LISTE LINIARESIMPLU ÎNLĂNŢUITE Declararea listelor Crearea listelor Operaţii cu liste Aplicaţii cu liste Realizat de prof. Zenovia Mihuc
Definirea unei liste de numere întregi type PNOD= ^NOD NOD= record info: integer; urm: PNOD; end; var l: PNOD; info reprezintă informaţia utilă din nod urm reprezintă adresa nodului următor din listă Definirea unei liste de elevi type P_ELEV= ^ELEV ELEV= record nume, prenume: integer; media: real:; urm: P_ELEV; end; var l: P_ELEV; nume, prenume, media reprezintă informaţia utilă din nod urm reprezintă adresa nodului următor din listă Declararea listelor
Crearea unei liste cu n noduri < secvenţa_1>{creează nodul cu numărul de ordine 1} for i:=2 to n do <secventa_2>{creează nodul cu numărul de ordine i} Vom scrie o funcţie {creare:pnod} care creează o listă liniară simplu înlănţuită de numere întregi, returnând un pointer către primul nod al listei. În timpul creării vom folosi 3 pointeri: - prim pointer către primul nod al listei create - nou va adresa la fiecare pas nodul pe care îl creăm - ultim va referi în permanenţă ultimul nod al listei
Alocam memorie pentru primul nod new (prim) Citim informatia utila din acest prim nod readln(prim^.info) Legatura urmatoare a acestuia este NIL prim^.urm:=NIL Pointerul ultim trebuie sa-l adresze tot pe el la fel ca si pointerul prim ultim:=prim prim ultim prim prim prim a)Crearea primului nod (<secventa_1>)
Alocam memorie pentru nodul nou new (nou) Citim informatia utila din nodul creat readln(nou^.info) Legatura sa urmatoare va fi NIL nou^.urm:=NIL Legatura urmatoare a nodului care era ultimul va adresa nodul nou creat (1)ultim^.urm:=nou Nodul nou creat va deveni ultimul (2)ultim:=nou . b)Crearea celorlalte noduri (<secventa_2>) nou nou nou nou prim ultim (1) nou prim (2) ultim
nou Urmărim şi crearea celui de-al treilea nod prim NIL NIL ultim • new (nou) ; readln(nou^.info); nou^.urm:=NIL
ultim^.urm:=nou ultim:=nou nou prim NIL ultim
Listă cu trei elemente nou prim NIL ultim
FUNCTIA DE CREARE function creare:pnod; var prim,ultim,nou:pnod; i,n:integer; begin write('n=');readln(n); new(prim);readln(prim^.info);prim^.urm:=NIL; ultim:=prim; for i:=2 to n do begin new(nou);readln(nou^.info);nou^.urm:=nil; ultim^.urm:=nou;ultim:=nou; end; creare:=prim; end;
Ştergerea de noduri • Ştergerea primului nod • Ştergerea ultimului nod • Ştergerea nodului cu numărul de ordine k din interiorul listei
Ştergerea primului nod q p ... NIL • Aducem un pointer q către al doilea nod, operaţie necesară întrucât după ştergere al doilea nod va deveni primul.q:=p^.urm • Ştergem fizic primul nod referit de p. dispose(p) După ştergere poinetrul pe care trebuie să-l returneze funcţia este q
Ştergerea ultimului nod al unei liste liniare simplu înlănţuite • Avem nevoie de un pointer către nodul aflat înaintea celui care va fi şters, adică penultimul. Şi de această dată funcţia trebuie să returneze un pointer către primul nod al listei rezultante, deci nu putem muta direct pointerul p deoarece nu ar mai avea cine să adreseze primul nod. • Facem o copie q a pointerului p{q:=p}şi mutăm la penultimul nod copia q. • Această mutare seva face într-un ciclu astfel: atâta timp cât q nu a ajuns la penultimul nod, mută q la nodul următor while q^.urm^.urm<> NIL do q:=q^.um
p q q mutare NIL Ştergerea propriu-zisă • Ştergem fizic ultimul nod,eliberând memoria ocupată: dacă q adresează penultimul nod, atunci ultimul nod este referit de q^.urm deci instrucţiunea este dispose(q^.urm) • Nodul care a fost penultimul înaintea ştergerii,adresat de q, va deveni ultimul după ştergere q^.urm:=NIL Funcţia returnează pointerul către primul nod, care a rămas p
k 1 ……………… k-1 k+1 …………. n p q q mutare legatura Ştergerea nodului cu numărul de ordine k din interiorul unei listei (2) r (1) • De această dată avem nevoie de pointeri atât pe nodul k ce urmează a fi şters cât şi penodul anterior k-1. Mai întâi facem o copie q a pointerului p către primulnod şi mutăm q la nodul k-1{for cu i de la 2 la k-1}. • Apoi pointerul r către nodul k va fi fireşte q^.urm. Ştergerea presupune realizarea unei singure legături, între nodul k-1 şi nodul k+1. Dupăcum se poate observa şi din desen, aceasta se poate face prin atribuirea q^.urm:=r^.urm. • Mai trebuie făcută eliberarea memoriei ocupate de nodul k {dispose(r)}