1 / 16

LISTE LINIARE SIMPLU ÎNLĂNŢUITE

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;

cady
Download Presentation

LISTE LINIARE SIMPLU ÎNLĂNŢUITE

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PROGRAMARE DINAMICĂ LISTE LINIARESIMPLU ÎNLĂNŢUITE Declararea listelor Crearea listelor Operaţii cu liste Aplicaţii cu liste Realizat de prof. Zenovia Mihuc

  2. 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

  3. 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

  4. 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>)

  5. 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

  6. nou Urmărim şi crearea celui de-al treilea nod prim NIL NIL ultim • new (nou) ; readln(nou^.info); nou^.urm:=NIL

  7. ultim^.urm:=nou ultim:=nou nou prim NIL ultim

  8. Listă cu trei elemente nou prim NIL ultim

  9. 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;

  10. Ştergerea de noduri • Ştergerea primului nod • Ştergerea ultimului nod • Ştergerea nodului cu numărul de ordine k din interiorul listei

  11. Ş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

  12. Ş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

  13. 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

  14. Funcţia ştergere la sfârşit

  15. 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)}

  16. STRUCTURA UNUI PROGRAM CU LISTE

More Related