facultatea de matematică și informatică - 10. tipul referinţăper/fp -_-/fp_10.pdfdinamice de...
TRANSCRIPT
![Page 1: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/1.jpg)
11/57/57
10.10. TipulTipul referinreferinţţăă
CC1010 / 7.12.2012/ 7.12.2012
TipulTipul referinreferinţţăă ~ pointeripointeri..
StructuriStructuri de date de date dinamicedinamice
ListeListe îînlănnlănţţuiteuite ..
ArboriArbori binaribinari
![Page 2: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/2.jpg)
22/57/57
10.1.10.1. TipulTipul referinreferinţţăă
Limbajul Pascal oferă posibilitatea de a lucra cu variabile:a) staticestatice
- Caracteristicile sunt bine definite, cunoscute şi fixe.- Nu se pot modifica în timpul execuţiei structura, tipul şi adresa de memorie.- Sunt referite prin numele lor o adresă de memorie. - Li se poate modifica doar valoarea, nu şi adresa.
b) dinamicedinamice- Au un tip bine precizat încă din faza de compilare însă ele pot fi alocate
dinamic (pot lua fiinţă în faza de execuţie a programului), pot fi utilizate (referite) prin adresa lor din memoria internă şi pot fi distruse (dealocate) dacă nu mai sunt utile.
- Pot fi referite printr-o variabilă de referinvariabilă de referinţţăă ce conţine adresa variabilei dinamice. Variabila de referinţă poate face referiri numai la variabile dinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă) între variabila dinamică şi tipul de date referinţă permite cunoaşterea structurii variabilei dinamice.
-- Variabilele de tip referinVariabilele de tip referinţţăă vor conţine adreseadrese de memorie ale variabilelor dinamice referite. Datorită acestui fapt, declararea tipului referinţă poate fi făcută îînainteanaintea definirii tipului variabilei dinamice referite.
![Page 3: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/3.jpg)
33/57/57
TipulTipul referinreferinţţăă
Definirea unui tip referinţă şi a variabilelor de tip referinţă se face astfel:TypeType Tip_ReferinTip_Referinţţă ă = = ^ ^ Tip_Var_DinamiTip_Var_Dinamicăcă;;
Tip_Var_DinamiTip_Var_Dinamicăcă = ...= ... { { poatepoate referireferi Tip_ReferinTip_Referinţţăă }}VarVar Var_Ref1,Var_Ref2,... : Tip_ReferinVar_Ref1,Var_Ref2,... : Tip_Referinţţăă;; {Vor con{Vor conţţine adrese}ine adrese}
Alocarea dinamicăAlocarea dinamică pentru variabila dinamică se realizează cu procedura:
New (Var_Ref)New (Var_Ref)care caută în memoria internă o zonă liberă pentru variabila dinamică şi furnizează adresa acestei zone în variabila de tip referinţă (Var_Ref). Această zonă este alocată variabilei dinamice, fără a fi iniţializată. Dimensiunea zonei alocate variabilei dinamice este determinată de tipul variabilei dinamice:Type Adresa=^Numar;Type Adresa=^Numar;
Numar = RecordNumar = RecordNumar_Cifre : Byte;Numar_Cifre : Byte;Sir_CifreSir_Cifre : Array [: Array [1..1001..100] of Byte] of Byte
End;End;Var n : AVar n : Adresa;dresa;BeginBegin New New (n);(n); { S{ Se alocă e alocă 101 101 octeti }octeti }
... ... {Prelucrare (n^) }{Prelucrare (n^) }End.End.
![Page 4: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/4.jpg)
44/57/57
TipulTipul referinreferinţţăă
Referirea unei variabile dinamice se face printr-o variabilă de tip referinţă (legată de variabila dinamică). Numele variabilei referinţă urmat de caracterul ''^'^' reprezintă numele variabilei dinamice.
Eliberarea zonei de memorie ocupată de o variabila dinamică se va executa cu instrucţiunea (apelul de procedură) :
Dispose (Var_Ref) Dispose (Var_Ref)
care disponibilizează zona de la adresa conţinută în variabila Var_Ref. Dacă o variabilă referinţă nu referă nici o variabilă dinamică, atunci valoarea variabilei referinţă este NilNil .
Variabilele referinţă se pot utiliza în instrucţiuni de atribuire prin care o astfel de variabilă primeşte valoarea altei variabile de acelaşi tip sau constanta NilNil şi, de asemenea, în expresii relaţionale cu operaţorii "==" sau "<><>".
Subliniem că orice referire a variabilei dinamice P^̂ trebuie să se facă între apelurile
New (P)New (P) şi Dispose (P).Dispose (P).
![Page 5: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/5.jpg)
55/57/57
TipulTipul referinreferinţţăă
În următorul program se adună două numere raţionale citite de la tastatură.Program Rationale; {Programul Tipul referinţă}
Type Q = ^Rational;
Rational = RecordNumarator ,Numitor : Integer
End;
Var a,b,c : Q ;Function Cmmdc (m,n:Integer) : Integer; {Gaseste c.m.m.d.c.}Var Rest:Integer; {al numerelor m şi n}Begin
While n<>0 Do BeginRest := m Mod n;m := n; n := Rest
End {while};Cmmdc := m
End; {Cmmdc}
![Page 6: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/6.jpg)
66/57/57
TipulTipul referinreferinţţăă
Function Cmmmc (m,n:Integer) : Integer; {Calculeaza c.m.m.m.c.}Begin {al numerelor m şi n nenule}
If m*n = 0 Then Writeln('nr.nul') ElseCmmmc := m * n Div Cmmdc (m,n)
End; {Cmmmc}
Procedure Simplific (Var p:Q); {Simplifica nr.rational p }Var Divizor_comun: Integer;Begin
With p^ do BeginDivizor_comun:=Cmmdc(Numarator,Numitor);If Divizor_comun > 1 Then Begin
Numarator := Numarator Div Divizor_comun;Numitor := Numitor Div Divizor_comun End {If}
End {With}End; {Simplific}
Procedure Citeste (Var p:Q); {Citeste nr.rational in p}Begin
Write (' Numarator,numitor = '); Readln (p^.Numarator, p^.Numitor);Simplific (p)
End; {Citeste}
![Page 7: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/7.jpg)
77/57/57
TipulTipul referinreferinţţăă
Procedure Aduna (a,b:Q; Var c:Q);Var N_comun: Integer; { Numitorul comun }Begin
N_comun := Cmmmc(a^.Numitor,b^.Numitor);c^.Numarator := a^.Numarator * (N_comun Div a^.Numitor) +
b^.Numarator * (N_comun Div b^.Numitor);c^.Numitor :=N_comun;Simplific (c)
End; {Aduna}
Procedure Tipareste (p:Q); {Tipareste nr.rational p}Begin With p^ do Write (Numarator,'/',Numitor)End;
Begin {Programul principal}New (a); Citeste (a); New (b); Citeste (b);New (c); Aduna (a,b,c);Tipareste(a); Write(' + '); Tipareste(b); Write(' = '); Tipareste (c);Dispose (a); Dispose (b); Dispose (c); Readln;
End.
![Page 8: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/8.jpg)
88/57/57
TipulTipul referinreferinţţăă
Vom rezolva în continuare aceeaşi problemă în altă manieră, utilizând funcţiaAduna pentru suma a două numere raţionale care va da ca rezultat adresa număruluiraţional calculat:Program Rationale; {Programul 2. Tipul referinţă}Type QQ = ^̂Rational;
Rational = Record Numarator, Numitor : Integer End;Var a, b : Q ;
Function Cmmdc (m,n:Integer) : Integer; {Gaseste c.m.m.d.c.}Var Rest:Integer; {al numerelor m şi n}Begin
While n<>0 do Begin Rest := m Mod n; m := n; n := Rest End {while};Cmmdc := m
End;
Function Cmmmc (m,n:Integer): Integer; {Calculeaza c.m.m.m.c.}Begin {al numerelor m şi n nenule}
If m*n = 0 Then Writeln('nr.nul') Else Cmmmc := m * n Div Cmmdc (m,n)End;
![Page 9: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/9.jpg)
99/57/57
TipulTipul referinreferinţţăă
Procedure Simplific (Var p:Q); { Simplifica nr.rational p }Var Divizor_comun: Integer;Begin
With p^ Do BeginDivizor_comun:=Cmmdc(Numarator,Numitor);If Divizor_comun > 1 Then Begin
Numarator := Numarator Div Divizor_comun;Numitor := Numitor Div Divizor_comun End {If}
End {With}End;
Procedure Citeste (Var p:Q); {Citeste nr.rational in p}Begin
With p^ do BeginWrite(' Numarator numitor = '); Readln (Numarator, Numitor);If Numitor=0 Then
RepeatWrite (' Numitor = 0! dati altul'); Readln (Numitor);
Until Numitor <> 0;End; {With}Simplific (p)
End;
![Page 10: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/10.jpg)
1010/57/57
TipulTipul referinreferinţţăă
Function Function AdunaAduna ((a,b:Qa,b:Q) : Q;) : Q;Var Numit_comun: Integer; s:Q;Begin
New (s);Numit_comun := Cmmmc(a^.Numitor,b^.Numitor);s^.Numarator:= a^.Numarator * (Numit_comun Div a^.Numitor)+
b^.Numarator * (Numit_comun Div b^.Numitor);s^.Numitor :=Numit_comun;Simplific (s);Aduna:=s; Dispose(s)Dispose(s)
End;Procedure Tipareste (p:Q); {Tipareste nr.rational p}Begin
With p^̂ Do Write (Numarator,'/',Numitor)End;Begin
New (a); Citeste (a); New (b); Citeste (b);Tipareste(a); Write('+'); Tipareste(b); Write('='); TiparesteTipareste(Aduna(a,b));Dispose(a); Dispose(b);Readln;
End.
![Page 11: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/11.jpg)
1111/57/57
TipulTipul referinreferinţţăă
În limbajul Pascal se pot utiliza variabile nelegate de un anumit tip de bază (tipulvariabilei dinamice) în scopul memorării valorilor unor variabile de tip referinţă(memorare de adrese). Acest tip referinţă nelegat, este tipul Pointer.
Operaţiile ce se pot efectua cu astfel de variabile sunt de tip atribuire astfel:
Var AdrP : PointerPointer;Adr1 : Tip_Referinţă1;Adr2 : Tip_Referinţă2;
Begin ...AdrP:=Adr1; ... AdrP^ ...... AdrP^ ... doar ... Tip_Referinţă1(AdrP)^̂ ...Adr2:=AdrP; ... Adr2^ ... sau ... Tip_Referinţă2(AdrP)^̂ ......
End.
În exemplul anterior funcţia Aduna putea avea următorul antet:
Function Aduna (a,b:Q) : PointerPointer;
fără a fi necesare alte modificări în program.
![Page 12: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/12.jpg)
1212/57/57
TipulTipul referinreferinţţăă
În următorul exemplu ne propunem să tipărim în hexazecimal conţinutul zonei de
memorie pe care se reprezintă un număr real.
Program Numar_Real; {Prgramul Pointeri}Const Lung = 6;Type Sir_Octeti = Array[1..Lung] of Byte;Var Pointer_Real : ^̂Real;
Pointer_Byte : ^̂Sir_Octeti;Pointer_Manevra : Pointer;i : Integer;
Function Hexa (Cifra:Byte) : Char; {Tipareste o cifra}Begin {hexazecimala}
If Cifra < 10 Then Hexa := Chr(Cifra+Ord('0'))Else Hexa := Chr(Cifra+Ord('A')-10)
End;
![Page 13: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/13.jpg)
1313/57/57
TipulTipul referinreferinţţăă
Procedure Print (Octet: Byte); {Tipareste continutul unui}
Begin {octet in hexazecimal}Write (Hexa(Octet Div 16));Write (Hexa(Octet Mod 16),' ')
End;
Begin {Programul principal}
New ( Pointer_Real);Write (' Dati un numar real : ');Readln ( Pointer_Real^ ^ );Pointer_Manevra := Pointer_Real;Pointer_Byte := Pointer_Manevra;For i:=1 to Lung do Print (Pointer_Byte^̂[i]);Dispose (Pointer_Real);Readln;
End.
![Page 14: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/14.jpg)
1414/57/57
10.2.10.2. StructuriStructuri de date de date DinamiceDinamice
StructuriStructuri de date de date :a) Multime 0 - 0b)b) ListeListe 1 1 -- 11c)c) ArboriArbori 1 1 -- n (2 n (2 --binaribinari))d) Grafe n - n
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
ListeListe :a) Static Vectorib)b) DinamicDinamic Refer. (Refer. (StiveStive ((LiFoLiFo), ), CoziCozi ((FiFoFiFo) (c), ) (c), ……))
![Page 15: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/15.jpg)
1515/57/57
ListeleListele pot pot fifi reprezentatereprezentate ((referitereferite) ) prinprin::
a) (Cap) (Cap,Coada la liste duble)
b) (Cap, Cursor) (Cap,cCap, Coada,cCoada) la liste duble)
iteratoriterator : Init(L), Next(L), Ultim(L), Pred(L), …
10.2.1.10.2.1.aa ListeListe îînlănnlănţţuiteuite DinamicDinamic
ListeleListele îînlănnlănţţuiteuite DinamicDinamic pot fi:
• Simple (de Puncte),• Duble (de Monoame)• Liste (de poligoane, de polinoame,…)
![Page 16: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/16.jpg)
1616/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Prin listă se înţelege o colecţie de elemente de acelaşi tipx1, x2, ... , xn,
în care x1 este primul element, xn este ultimul element şi pentru 1 < k < n elementulxk are un unic succesor (pe xk+1) şi un unic predecesor (pe xk-1).
Asupra listelor liniare putem defini operaţii care să ne permită adăugarea unuielement în lista, extragerea unui element (cu stergerea lui) din lista, cautarea unuielement cu o anumita proprietate şi crearea unei liste vide.
Se poate stabili o corespondenţă biunivocă între elementele listei liniare şisubmulţimea numerelor naturale {1, 2, ..., n} astfel: primului element îi ataşăm 1, următorului 2 şi aşa mai departe, iar ultimului n. Numărul natural asociat unuielement din listă se numeşte poziţia elementului respectiv. Vom spune căelementul de pe poziţia i precede elementul de pe poziţia j dacă i < j .
Rezultă că pe o astfel de structură de date putem defini următoarele funcţii: Următorul, Precedentul şi Poziţia unui element, aşa cum se va vedea mai jos.
![Page 17: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/17.jpg)
1717/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
SpecificareaSpecificarea acestor operaţii se dă în continuare:• OperaOperaţţiaia CREARE(L)CREARE(L) este:
L := lista vidă (fără nici un element);• OperaOperaţţiaia ADĂUGARE ADĂUGARE ((L,aL,a)) este: {în coada listei}
Dacă L la intrare conţine elementele :x1, x2, ... , xn,
după efectuarea operaţiei, lista L va conţine elementele :x1, x2, ... , xn, xn+1, unde xn+1 = a .
• OperaOperaţţiaia CĂUTARE CĂUTARE ((L,a,pL,a,p) este:Dacă L conţine elementele :
x1, x2, ... , xn, după efectuarea operaţiei, p primeşte o valoare între 1 şi n astfel ca xp = a, sau
valoarea n+1 în caz contrar.• OperaOperaţţiaia EXTRAGERE (EXTRAGERE (L,p,aL,p,a)) este:
Daca L conţine la intrare elementele :x1, x2, ... , xn,
după efectuarea operaţiei a primeşte valoarea xp iar lista va avea elementele :x1, x2, ... , xp-1, xp+1, ..., xn,
deci elementul xp a fost eliminat din listă.
![Page 18: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/18.jpg)
1818/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Implementarea acestor operaţii depinde de reprezentarea listei în memoria calculatorului.
Reprezentarea unei liste liniare poate fi staticăstatică sau dinamicădinamică.Reprezentarea staticăReprezentarea statică a unei liste se realizează printr-un vector X cu
componentelex1, x2, ... , xn .
Reprezentarea este statică întrucât alocarea memoriei necesare vectorului X este făcută în timpul compilării. Deci locul în memorie al elementelor listei nu se schimbă pe timpul executiei. Elementele listei se vor afla în memorie în locaţii consecutive cu o lungime maximă (declarată) care nu poate fi depăşită şi nici schimbată în timpul executiei.
Reprezentarea dinamicăReprezentarea dinamică se realizează cu ajutorul tipului PointerPointer, alocarea memoriei făcându-se în timpul execuţiei.
Se va utiliza o structură mult mai flexibilă în care fiecare nod este legat de nodul următor al listei. Această structură o vom numi listă listă îînlannlanţţuităuită şi implementarea ei se poate realiza prin alocare dinamică a memoriei. Zona de memorie ocupată de o astfel de listă creşte sau scade după cum lista conţine mai multe sau mai puţine elemente, prin operaţii de adăugare, respectiv de ştergere.
![Page 19: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/19.jpg)
1919/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
O listă înlănţuită o vom reprezenta grafic astfel :
Informaţie Leg Informaţie Leg Informaţie Leg Informaţie LegPrimul Ultimul
Nil
Un element din listă va conţine pe lângă informaţia propriu-zisă şi adresa (referinţa) următorului element din listă (marcată în figura de mai sus prin săgeţi). În acest fel având adresa primului element, vom putea accesa (regăsi) orice element din lista înlănţuită prin parcurgarea secvenţială a acesteia.
Ultimul element va conţine o informaţie (cod) de "santinelă" care va marca sfârşitul listei. Acest cod poate avea valoarea Nil ceea ce înseamnă că acest element nu mai este legat de un altul (nu există următorul element).
O astfel de listă, care conţine în fiecare element adresa următorului element poate fi parcursă doar secvenţial începând de la primul element până la ultimul, într-un singur sens. Această structură o vom numi listă simplu înlănţuită .
![Page 20: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/20.jpg)
2020/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Variabilele de tip referinţă dintr-un program Pascal care utilizează o listă simplu
înlănţuită se pot declara astfel :
Type Type Tip_InfoTip_Info = ... ;= ... ;
AdrAdr = ^= ^Tip_ElemTip_Elem;;Tip_ElemTip_Elem = Record= Record
InformatieInformatie : : Tip_InfoTip_Info;;Leg : AdrLeg : Adr
End;End;
Var Primul, Element, Ultimul, Nou : Adr;Var Primul, Element, Ultimul, Nou : Adr;
O listă simplu înlănţuită, în functie de disciplina de generare a ei (prin adăugare element cu element) poate fi: lista înlănţuită înainte, lista înlănţuită înapoi şi listă înlănţuită ordonată.
![Page 21: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/21.jpg)
2121/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Lista înlănţuită înainte este lista în care adăugarea se face în coada listei, aşa cum se poate vedea în figura următoare:
Ultimul
UltimulPrimul Nou
Informaţie Leg Informaţie Leg Informaţie Leg Informaţie Leg
NilNil
Operaţia scrisă în Pascal este următoarea :
Procedure Adaug_in_coada (Nou:Adr; Var Primul,Ultimul:Adr);Procedure Adaug_in_coada (Nou:Adr; Var Primul,Ultimul:Adr);BeginBegin Nou^.Leg:=Nil;Nou^.Leg:=Nil; If Primul If Primul=Nil =Nil Then Primul Then Primul := No:= Nouu { P{ Prima adăugare rima adăugare }}
Else Ultimul^.Leg := Nou;Else Ultimul^.Leg := Nou;Ultimul:=NouUltimul:=Nou
End;End;
![Page 22: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/22.jpg)
2222/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Lista înlănţuită înapoi este lista în care adăugarea se face în capul listei, aşa cum se poate vedea în figura de mai jos :
Operaţia scrisă în Pascal este următoarea :
Procedure Adaug_in_cap (Nou:Adr; Var Primul:Adr);Procedure Adaug_in_cap (Nou:Adr; Var Primul:Adr);
BeginBegin
Nou^.Leg := Primul;Nou^.Leg := Primul;
Primul := NouPrimul := Nou
End;End;
Informaţie Leg Informaţie Leg Informaţie Leg Informaţie Leg
Nil
Primul
Nou Primul
![Page 23: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/23.jpg)
2323/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Lista înlănţuită ordonată este lista în care adăugarea se face astfel încât elementele listei să fie într-o anumită ordine (crescător sau descrescător după o anumită cheie) aşa cum se poate vedea în următoarea figură :
Dacă ORDINE este o funcţie booleană care precizează ordinea dorită, atunci procedura Pascal corespunzătoare este :
Procedure Adaug_ord (Nou:Adr; Var Primul:Adr);Procedure Adaug_ord (Nou:Adr; Var Primul:Adr);Var Var Elem, Prec : Adr;Elem, Prec : Adr;Begin Elem:=Primul;Begin Elem:=Primul;
While (Elem<>Nil) and not While (Elem<>Nil) and not ORDINE(ElemORDINE(Elem, , NouNou) do Begin) do Begin { { CautaCauta locullocul }}Prec := Elem; Elem := Elem^.LegPrec := Elem; Elem := Elem^.Leg End;End; { de inserare }{ de inserare }
Nou^.Leg := Elem;Nou^.Leg := Elem; If Elem If Elem=Primul=Primul Then Primul Then Primul:= No:= Nouu { A{ Adăugare dăugare îînaintea primului element }naintea primului element }
Else Prec^.Leg := Nou;Else Prec^.Leg := Nou;End;End;
Nil
Primul Prec Elem
Informaţie LegNou
Informaţie Leg Informaţie Leg Informaţie Leg Informaţie Leg
![Page 24: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/24.jpg)
2424/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
În exemplul următor vom genera o listă prin adăugarea elementelor în coada listei, în capătul listei sau în aşa fel încât lista sa fie ordonată după un câmp numit cheie. Disciplina de adăugare va fi aleasă de către utilizator.
Program Liste_simplu_inlantuite;Program Liste_simplu_inlantuite; {Programul Liste}{Programul Liste}Type Type
Tip_Cheie = Integer;Tip_Cheie = Integer;Tip_Date = String[20];Tip_Date = String[20];
Tip_InfoTip_Info = Record= RecordCheieCheie : : Tip_CheieTip_Cheie;;Date : Date : Tip_DateTip_DateEnd;End;
Adr = ^Tip_Elem;Adr = ^Tip_Elem;Tip_Elem = RecordTip_Elem = Record
Inf : Tip_Info;Inf : Tip_Info;Leg : AdrLeg : AdrEnd;End;
Var Lista : Adr;Var Lista : Adr; { Adresa primului element }{ Adresa primului element }Disc : Char;Disc : Char; { Tipul adaugarii }{ Tipul adaugarii }
![Page 25: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/25.jpg)
2525/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Procedure CitescCitesc ((VarVar Element:AdrElement:Adr););BeginBegin
New (Element);New (Element);Write (' ................... Write (' ................... CheieCheie, Date : ');, Date : ');With Element^, With Element^, InfInf do do ReadlnReadln ((Cheie,DateCheie,Date))
End;End;Procedure Procedure GenerareGenerare (Var Primul:Adr; Disc:Char);(Var Primul:Adr; Disc:Char);Var Nou,Ult : Adr; Rasp : Char;Var Nou,Ult : Adr; Rasp : Char;
Procedure Procedure Adaug_in_coadaAdaug_in_coada;;BeginBegin
Nou^.LegNou^.Leg:=Nil;:=Nil;If If PrimulPrimul=Nil Then =Nil Then PrimulPrimul := := NouNou Else Else Ult^.LegUlt^.Leg := := NouNou;;UltUlt:=:=NouNou
End;End;Procedure Procedure Adaug_in_capatAdaug_in_capat;;BeginBegin
Nou^.LegNou^.Leg := := PrimulPrimul;;PrimulPrimul := := NouNou
End;End;
![Page 26: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/26.jpg)
2626/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Procedure Inserare_ordInserare_ord; ; VarVar Elem, Elem, PrecPrec : : AdrAdr;;BeginBegin Elem:=Elem:=PrimulPrimul;;While (Elem<>Nil) and (While (Elem<>Nil) and (Elem^.Inf.CheieElem^.Inf.Cheie < < Nou^.Inf.CheieNou^.Inf.Cheie) do Begin ) do Begin
Prec := Elem; Elem := Elem^.LegPrec := Elem; Elem := Elem^.Leg End;{While}End;{While}Nou^.LegNou^.Leg := Elem;:= Elem;If Elem=If Elem=PrimulPrimul Then Then PrimulPrimul := := NouNou
Else Prec^.Leg := Nou;Else Prec^.Leg := Nou;End;End;
BeginBegin {{GenerareGenerare}}PrimulPrimul:=Nil;:=Nil;RepeatRepeat
RepeatRepeatWrite ('Adaugati(D,N):'); Readln(Rasp); Rasp:=Upcase(Rasp);Write ('Adaugati(D,N):'); Readln(Rasp); Rasp:=Upcase(Rasp);
Until Rasp in ['D','N'];Until Rasp in ['D','N'];If Rasp = 'D' ThenIf Rasp = 'D' Then BeginBegin
CitescCitesc ((NouNou););Case Disc ofCase Disc of 'F' : 'F' : Adaug_in_coadaAdaug_in_coada;;
'L' : Adaug_in_capat;'L' : Adaug_in_capat;'O' : Inserare_ord'O' : Inserare_ord
End {Case}End {Case} End {If}End {If}Until Rasp = 'N'Until Rasp = 'N'
End;End;
![Page 27: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/27.jpg)
2727/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Procedure ParcurgereParcurgere ((Elem:AdrElem:Adr););BeginBegin
While Elem <> Nil Do With Elem^ Do BeginWhile Elem <> Nil Do With Elem^ Do BeginWith With InfInf Do Do WritelnWriteln (Cheie:5,Date);(Cheie:5,Date);Elem:=LegElem:=Leg End {With}End {With}
End;End;BeginBegin { Main}{ Main} Repeat Repeat Writeln Writeln (' (' Ce disciplina doriti la adăugare Ce disciplina doriti la adăugare ? ');? ');
Writeln (' F = in coada listei (FIFO) ');Writeln (' F = in coada listei (FIFO) ');Writeln (' L = in capul listei (LIFO) ');Writeln (' L = in capul listei (LIFO) ');Writeln (' O = lista ordonata ');Writeln (' O = lista ordonata ');Write (' Write (' OptiuneOptiune : ');: ');ReadlnReadln (Disc); Disc:=(Disc); Disc:=Upcase(DiscUpcase(Disc))
Until Disc in ['F','L','O'];Until Disc in ['F','L','O'];Generare (Lista,Disc);Generare (Lista,Disc); { Creerea listei }{ Creerea listei }For Disc:='A' to 'E' do For Disc:='A' to 'E' do WritelnWriteln;;Writeln('ElementeleWriteln('Elementele listeilistei suntsunt:');:');ParcurgereParcurgere ((ListaLista); ); ReadlnReadln { { ListareaListarea listeilistei }}
End.End.
![Page 28: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/28.jpg)
2828/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Ştergerea unui element din listă se realizează prin modificarea legăturiielementului precedent (dacă acesta există) urmată de dealocarea zonei ocupatede elementul şters astfel
Operaţia de ştergere (scrisă în Pascal) a elementului Elem din lista L esteurmătoarea :
Procedure Procedure Stergere(VarStergere(Var Elem,Prec,LElem,Prec,L: : AdrAdr);); {{PrecPrec==precedentulprecedentul }}BeginBegin { { luilui Elem }Elem }
If L = ElemIf L = Elem { { dacădacă se se stergesterge primulprimul element }element }Then L := Then L := Elem^.LegElem^.LegElse Prec^.Leg := Elem^.Leg; Else Prec^.Leg := Elem^.Leg;
Dispose (Elem);Dispose (Elem);End;End;
Informaţie Leg Informaţie Leg Informaţie Leg Informaţie Leg
Nil
Primul Prec Elem
![Page 29: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/29.jpg)
2929/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
În exemplul următor se poate urmări ştergerea unor elemente precizate prin cheia conţinută în informaţia propriu-zisă a elementelor .
Program Stergere_element_din_lista;Program Stergere_element_din_lista;{Creeaza o lista de elemente (cheie,string),}{Creeaza o lista de elemente (cheie,string),}{apoi sterge elemente {apoi sterge elemente şşi tipareste lista finala }i tipareste lista finala }
Type Tip_Cheie = Integer;Type Tip_Cheie = Integer;Tip_DateTip_Date = String[20];= String[20];Tip_InfoTip_Info = Record= Record
CheieCheie : : Tip_CheieTip_Cheie;;Date : Date : Tip_DateTip_DateEnd;End;
Adr = ^Tip_Elem;Adr = ^Tip_Elem;Tip_Elem = RecordTip_Elem = Record
Inf : Tip_Info; Inf : Tip_Info; Leg : AdrLeg : AdrEnd;End;
Var Lista : Adr;Var Lista : Adr; { Adresa primului element }{ Adresa primului element }
![Page 30: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/30.jpg)
3030/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Citesc (Var Element:Adr);Procedure Citesc (Var Element:Adr); {Citeste informatia}{Citeste informatia}BeginBegin {din nodul Element}{din nodul Element}
Write (' ............ Write (' ............ CheieCheie, Date : '); , Date : '); With With Element^.InfElement^.Inf do do Readln(Cheie,DateReadln(Cheie,Date))
End;End;Procedure Generare (Var Primul:Adr);Procedure Generare (Var Primul:Adr); {Creaza lista}{Creaza lista}Var Nou : Adr; Rasp : Char;Var Nou : Adr; Rasp : Char;BeginBegin
PrimulPrimul:=Nil;:=Nil;RepeatRepeat
RepeatRepeatWrite (' Write (' AdaugatiAdaugati (D,N) : ');(D,N) : ');Readln (Rasp); Rasp:=Upcase(Rasp);Readln (Rasp); Rasp:=Upcase(Rasp);
Until Rasp in ['D','N'];Until Rasp in ['D','N'];If Rasp = 'D' Then BeginIf Rasp = 'D' Then Begin
New(Nou); Citesc (Nou);New(Nou); Citesc (Nou);Nou^.leg:=Primul; Primul:=NouNou^.leg:=Primul; Primul:=Nou
End {If}End {If}Until Rasp = 'N'Until Rasp = 'N'
End;End;
![Page 31: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/31.jpg)
3131/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Stergere (Var Primul,Prec:Adr);Procedure Stergere (Var Primul,Prec:Adr); {Sterge succesorul}{Sterge succesorul}Var Elem:adr;Var Elem:adr; { lui Prec din lista Primul}{ lui Prec din lista Primul}BeginBegin
If (If (PrecPrec=Nil)=Nil)ThenThen BeginBegin Elem:=Elem:=PrimulPrimul; ;
Primul := Primul^.Leg Primul := Primul^.Leg EndEnd
ElseElse BeginBegin Elem:=Prec^.Leg; Elem:=Prec^.Leg; Prec^.Leg := Elem^.Leg Prec^.Leg := Elem^.Leg
End;End;Dispose (Elem)Dispose (Elem)
End;End;Procedure Cauta(Primul:adr; Cod: Tip_Cheie; Var Prec:adr);Procedure Cauta(Primul:adr; Cod: Tip_Cheie; Var Prec:adr);Var Elem:Adr;Var Elem:Adr; {Cauta in lista Primul, elementul cu cheia Cod }{Cauta in lista Primul, elementul cu cheia Cod }BeginBegin { { şşi retine in Prec predecesorul acestui element }i retine in Prec predecesorul acestui element }
Elem:=Primul; Prec := Nil;Elem:=Primul; Prec := Nil;While (Elem<>Nil) And (Elem^.Inf.Cheie<>Cod) Do BeginWhile (Elem<>Nil) And (Elem^.Inf.Cheie<>Cod) Do Begin
Prec:=Elem; Elem:=Elem^.LegPrec:=Elem; Elem:=Elem^.Leg End; {While}End; {While}If (Elem=Nil) Then If (Elem=Nil) Then WriteLNWriteLN (' Nu (' Nu existaexista elementulelementul cu cu codulcodul ',Cod)',Cod)
End;End;
![Page 32: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/32.jpg)
3232/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Procedure StergelementeStergelemente ((VarVar Primul:AdrPrimul:Adr);); {{StergeSterge la la cererecerere}}VarVar Elem,PrecElem,Prec : : AdrAdr;; {{elementeelemente din din listalista PrimulPrimul}}
Cod : Cod : Tip_CheieTip_Cheie; Rasp : Char; ; Rasp : Char; BeginBegin
RepeatRepeatWrite ('Write ('StergSterg element ? element ? (D,N):'); Readln(Rasp); Rasp:=Upcase(Rasp);(D,N):'); Readln(Rasp); Rasp:=Upcase(Rasp);If Rasp='D' Then BeginIf Rasp='D' Then Begin
Write (' Write (' CheiaCheia elementuluielementului : '); : '); Readln(CodReadln(Cod););Cauta(Primul,Cod,Prec); Stergere(Primul,Prec)Cauta(Primul,Cod,Prec); Stergere(Primul,Prec)
End {If}End {If}Until Rasp='N'Until Rasp='N'
End;End;Procedure Parcurgere (Primul:Adr);Procedure Parcurgere (Primul:Adr); {Parcurge lista Primul}{Parcurge lista Primul}Var Elem:adr;Var Elem:adr; {si{si--i tipareste continutul}i tipareste continutul}BeginBeginWhile Elem <> Nil Do Begin With While Elem <> Nil Do Begin With Elem^.infElem^.inf do do WritelnWriteln (Cheie:5,Date);(Cheie:5,Date);
Elem:=Elem^.Leg End {While}Elem:=Elem^.Leg End {While}End;End;BeginBegin {Programul principal }{Programul principal }
Generare (Lista);Generare (Lista); { Creerea listei }{ Creerea listei }Stergelemente(Lista);Stergelemente(Lista); { Stergere elemente }{ Stergere elemente }Parcurgere (Lista);Parcurgere (Lista); ReadlnReadln { Listarea listei }{ Listarea listei }
End.End.
![Page 33: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/33.jpg)
3333/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Lista simplu înlănţuită poate fi traversată doar într-un singur sens începând cu primul până la ultimul element, pentru că un element conţine doar adresa următorului element din listă. Dacă dorim sa traversăm lista şi invers (de la coadă la capăt) atunci va trebui să reţinem în fiecare element şi adresa elementului anterior (precedent) :
O listă care are această proprietate se numeşte lista dublu lista dublu îînlănnlănţţuităuită şi se reprezinta grafic astfel:
Leg.St. Informaţie Leg.Dr.
Primul Ultim
NilNil
LegSt Inf. LegDr.LegSt. Inf. LegDr. LegSt. Inf. LegDr. LegSt. Inf. LegDr.
![Page 34: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/34.jpg)
3434/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Variabilele de tip referinţă dintr-un program Pascal care utilizează o listă dublu înlănţuită se pot declara astfel:
Type Type Tip_CheieTip_Cheie = ...;= ...;Tip_DateTip_Date = ...;= ...;Tip_InfoTip_Info = Record= Record
Cod : Cod : Tip_CheieTip_Cheie;;Info : Tip_DateInfo : Tip_DateEnd;End;
Adr = ^Tip_Elem;Adr = ^Tip_Elem;Tip_ElemTip_Elem = Record= Record
Leg_PrecedLeg_Preced : : AdrAdr;; {{Leg_StLeg_St}}InformatiiInformatii : : Tip_InfoTip_Info;;Leg_UrLeg_Următormător : : AdrAdr {{Leg_DrLeg_Dr}}End;End;
VarVar PrimulPrimul, , UltimUltim, Elem, , Elem, PrecPrec, , NouNou : : AdrAdr;;
![Page 35: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/35.jpg)
3535/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Operaţia de adăugareadăugare într-o listă dublu înlănţuită se poate realiza astfel :
LegLegStSt Inf. LegDr.LegLegStSt. Inf. LegDr. LegLegStSt. Inf. LegDr. LegLegStSt. Inf. LegDr.
NilNilNilNou
LegLegStSt. Inf. LegDr.
Primul UltimUltimPrec Elem
O procedură Pascal care realizează inserarea elementului Nou în faţa elementuluiElem este următoarea:Procedure Procedure Inserare(VarInserare(Var Nou,ElemNou,Elem: : AdrAdr););BeginBegin
((Elem^.leg_st)^.Leg_drElem^.leg_st)^.Leg_dr:=:=NouNou;;NouNou^ .^ .Leg_StLeg_St:=:=Elem^.Leg_StElem^.Leg_St;;Nou^ .Leg_Dr:=Elem;Nou^ .Leg_Dr:=Elem;Elem^.Leg_St:=Nou;Elem^.Leg_St:=Nou;
End;End;
![Page 36: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/36.jpg)
3636/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Operaţia de şştergeretergere a elementului Elem dintr-o listă dublu înlănţuită se poate schiţa astfel:
O procedură Pascal corespunzatoare acestei operaţii este următoarea:
Procedure Stergere(Var Elem : Adr);Procedure Stergere(Var Elem : Adr);BeginBegin
(Elem^.Leg_St)^.Leg_Dr:=Elem^.Leg_Dr;(Elem^.Leg_St)^.Leg_Dr:=Elem^.Leg_Dr;(Elem^.Leg_Dr)^.Leg_St:=Elem^.Leg_St;(Elem^.Leg_Dr)^.Leg_St:=Elem^.Leg_St;Dispose (Elem);Dispose (Elem);
End;End;
LegSt. Inf. LegDr.LegSt. Inf. LegDr. LegSt. Inf. LegDr. LegSt. Inf. LegDr.
NilNil
Primul UltimElem
![Page 37: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/37.jpg)
3737/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
În exemplul următor se poate urmări generarea unei liste dublu înlănţuite urmate de parcurgerea acesteia în ambele sensuri:
Program Liste_dublu_inlantuite;Program Liste_dublu_inlantuite;
Type Type Tip_CheieTip_Cheie = Integer;= Integer;Tip_DateTip_Date = String[20];= String[20];Tip_InfoTip_Info = Record = Record CheieCheie : : Tip_CheieTip_Cheie; Date : ; Date : Tip_DateTip_Date End;End;AdrAdr = ^= ^Tip_ElemTip_Elem;;Tip_ElemTip_Elem = Record= Record
InfInf : : Tip_InfoTip_Info; ; Leg_StLeg_St, , Leg_DrLeg_Dr : : AdrAdrEnd;End;
DirectieDirectie = (= (Inainte,InapoiInainte,Inapoi););
VarVar Prim : Prim : AdrAdr;; { { AdresaAdresa primuluiprimului element }element }UltimUltim : : AdrAdr;; { { AdresaAdresa ultimuluiultimului element }element }Disc : Char;Disc : Char; { { TipulTipul adaugariiadaugarii }}
![Page 38: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/38.jpg)
3838/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Procedure CitescCitesc ((VarVar Element:AdrElement:Adr);); {{CitesteCiteste informatiainformatia}}BeginBegin {{dintrdintr--un nod}un nod}
New (Element);New (Element);Write (' ............... Write (' ............... CheieCheie, Date : ');, Date : ');With Element^, With Element^, InfInf Do Do ReadlnReadln ((Cheie,DateCheie,Date))
End;End;
Procedure Procedure GenerareGenerare (Disc:Char; Var Primul,Ultim:Adr); (Disc:Char; Var Primul,Ultim:Adr);
{ Creaza o lista dublu { Creaza o lista dublu îînlănnlănţţuită uită }}Var Nou : Adr; Rasp : Char;Var Nou : Adr; Rasp : Char;Procedure Procedure Adaug_in_coadaAdaug_in_coada;;BeginBeginNou^.Leg_DrNou^.Leg_Dr:=Nil; :=Nil; Nou^.Leg_StNou^.Leg_St:=:=UltimUltim;;If If PrimulPrimul = Nil Then = Nil Then PrimulPrimul := := NouNou
Else Ultim^.Leg_Dr := Nou;Else Ultim^.Leg_Dr := Nou;Ultim:=NouUltim:=Nou
End;End;
![Page 39: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/39.jpg)
3939/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
Procedure Procedure Adaug_in_capAdaug_in_cap;;BeginBegin
Nou^.Leg_DrNou^.Leg_Dr := Prim; := Prim; Nou^.Leg_StNou^.Leg_St := Nil;:= Nil;If Prim = Nil Then If Prim = Nil Then UltimUltim := := NouNou Else Else Prim^.Leg_StPrim^.Leg_St := := NouNou;;Prim := NouPrim := Nou
End;End;Procedure Inserare_ord;Procedure Inserare_ord; Var Prec,Elem : Adr;Var Prec,Elem : Adr;Begin Elem:=Begin Elem:=PrimulPrimul;;While (Elem<>Nil) and (While (Elem<>Nil) and (Elem^.Inf.CheieElem^.Inf.Cheie < < Nou^.Inf.CheieNou^.Inf.Cheie))
Do Elem := Elem^.Leg_dr;Do Elem := Elem^.Leg_dr;If Elem=Nil Then If Elem=Nil Then Adaug_in_coadaAdaug_in_coada ElseElse
If Elem=If Elem=PrimulPrimul Then Then Adaug_in_capAdaug_in_cap Else BeginElse BeginPrecPrec := := Elem^.Leg_StElem^.Leg_St;;Nou^.Leg_StNou^.Leg_St := := PrecPrec; ; Nou^.Leg_DrNou^.Leg_Dr := Elem;:= Elem;Elem^.Leg_StElem^.Leg_St:= := NouNou;;Prec^.Leg_DrPrec^.Leg_Dr:= := NouNou
End {If}End {If}End {End {inserareinserare};};
![Page 40: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/40.jpg)
4040/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
BeginBegin {{GenerareGenerare}}PrimulPrimul:=Nil; :=Nil; UltimUltim:=Nil;:=Nil;RepeatRepeat
RepeatRepeatWrite (' Adaugati (D,N) : '); Readln (Rasp); Rasp:=Upcase(RWrite (' Adaugati (D,N) : '); Readln (Rasp); Rasp:=Upcase(Rasp);asp);
Until Rasp In ['D','N'];Until Rasp In ['D','N'];If Rasp = 'D' Then Begin If Rasp = 'D' Then Begin New(NouNew(Nou); ); CitescCitesc ((NouNou););
Case Disc ofCase Disc of'F' : Adaug_in_coada; 'L' : Adaug_in_cap; 'O' : Inserare_ord'F' : Adaug_in_coada; 'L' : Adaug_in_cap; 'O' : Inserare_ord
End {Case}End {Case}End {If}End {If}
until Rasp = 'N'until Rasp = 'N'End;End;Procedure Procedure ParcurgereParcurgere ((Elem:AdrElem:Adr; ; Sens:DirectieSens:Directie););BeginBegin
While Elem <> Nil Do BeginWhile Elem <> Nil Do BeginWith With Elem^.InfElem^.Inf do do WritelnWriteln (Cheie:5,Date);(Cheie:5,Date);If If SensSens==InainteInainte Then Elem:=Then Elem:=Elem^.Leg_DrElem^.Leg_Dr Else Elem:=Else Elem:=Elem^.Leg_StElem^.Leg_St
End {While}End {While}End;End;
![Page 41: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/41.jpg)
4141/57/57
10.2.1.10.2.1. ListeListe îînlănnlănţţuiteuite..
BeginBeginRepeatRepeat
WritelnWriteln (' (' CeCe disciplinadisciplina doritidoriti la la adăugareadăugare ? ? ');');Writeln (' F = in coada listei (FIFO) ');Writeln (' F = in coada listei (FIFO) ');Writeln (' L = in capul listei (LIFO) ');Writeln (' L = in capul listei (LIFO) ');Writeln (' O = lista ordonata ');Writeln (' O = lista ordonata ');Write (' Write (' OptiuneOptiune : ');: ');ReadlnReadln (Disc); Disc:=(Disc); Disc:=Upcase(DiscUpcase(Disc))
Until Disc In ['F','L','O'];Until Disc In ['F','L','O'];Generare (Disc, Prim, Ultim );Generare (Disc, Prim, Ultim ); { Creerea listei }{ Creerea listei }
Writeln('Lista inainte');Writeln('Lista inainte');Parcurgere (Prim,Inainte);Parcurgere (Prim,Inainte); { Traversare inainte }{ Traversare inainte }
Writeln('Lista inapoi');Writeln('Lista inapoi');Parcurgere (Ultim ,Inapoi );Parcurgere (Ultim ,Inapoi ); { Traversare inapoi }{ Traversare inapoi }
ReadlnReadlnEnd.End.
![Page 42: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/42.jpg)
4242/57/57
10.2.1.10.2.1. ArboriArbori BinariBinari
O colecţie de elemente are o structură de tip arborescent dacă elementelecomponente sunt în relaţie unu la mai_multe, adică un element este în relaţie cu mai multe elemente.
Elementele unei astfel de structuri se numesc noduri sau vârfuri. Ele au un unic predecesor numit părinte dar mai mulţi succesori numiţi fii.
r
ii
i iii
t t t t t
Un arbore este format din mulţimea nodurilor şi legăturile dintre acestea. Un nod al unui arbore poate fi:
• rădăcină(dacă nu are predecesor - părinte ) sau
• nod intern(are un singur părinte şi mai mulţi fii) sau
• nod terminal sau frunză( nu are nici un succesor-fiu).
![Page 43: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/43.jpg)
4343/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Un arbore particular este arborele binararborele binar pentru care relaţia dintre elemente este de tip unu la două, adică un element poate avea maxim doi succesori:
Rădăcina
Sub-arbore
stâng
Sub-arbore
drept
r
ii
i iii
f f f f f
Un arbore particular este arborele binararborele binar pentru care relaţia dintre elemente este de tip unu la două, adică un element poate avea maxim doi succesori:
00
11 22
1111 2121 2222
111111 211211112112 212212 222222
NilNil
NilNil
NilNil NilNil
![Page 44: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/44.jpg)
4444/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Deci o variabilă de tip arbore va avea tipul Arbore definit astfel:Type Type Arbore = Arbore = ^̂Tip_Elem;Tip_Elem;
Tip_Elem = RecordTip_Elem = RecordInfo Info : : Tip_InfoTip_Info;;As, Ad : As, Ad : AdrAdr
End;End;Aici Tip_Info este tipul informaţiei pastrată într-un nod, putând fi orice tip Pascal
definit anterior.
As Info AdAs Info Ad
Prin traversareatraversarea unui arbore binar vom înţelege parcurgerea tuturor vârfurilor arborelui, trecând o singură dată prin fiecare nod.
În funcţie de ordinea (disciplina) de vizitare a nodurilor unui arbore binar, traversarea poate fi îîn preordinen preordine, îîn inordinen inordine sau îîn postordinen postordine.
![Page 45: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/45.jpg)
4545/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Traversarea în preordinepreordine este aceea în care se parcurge mai întâi nodul rădăcină, apoi subarborele stâng şi după aceea subarborele drept. Deci se parcurge arborele în ordinea (RădăcinăRădăcină, Subarbore_stâng, Subarbore_drept, Subarbore_stâng, Subarbore_drept). Evident, definiţia este recursivă, parcurgerea unui subarbore fiind facută dupa aceaşi regulă, deci începând cu rădăcina. O procedură Pascal corespunzatoare se dă în continuare.
Procedure Preordine (R:Arbore);Procedure Preordine (R:Arbore);
BeginBeginIf R<>Nil Then With R^ do BeginIf R<>Nil Then With R^ do Begin
Prelucrare (Info);Prelucrare (Info);Preordine (As);Preordine (As);Preordine (Ad)Preordine (Ad) End {if}End {if}
End;End;
Procedura Prelucrare (Nod) poate reprezenta orice subalgoritm de prelucrare a informaţiei din nodul specificat (de exemplu tipărirea informaţilor).
![Page 46: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/46.jpg)
4646/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Traversarea în inordineinordine este aceea în care se parcurge mai întâi subarborele stâng, apoi nodul rădăcină şi după aceea subarborele drept. Deci se parcurge arborele în ordinea (Subarbore_stâng, Subarbore_stâng, RădăcinăRădăcină, Subarbore_drept, Subarbore_drept). În continuare este prezentată o procedură Pascal de traversarea în inordine :
Procedure Inordine (R:Arbore);Procedure Inordine (R:Arbore);BeginBegin
If R<>Nil Then With R^ do BeginIf R<>Nil Then With R^ do BeginInordine (As);Inordine (As);Prelucrare (Info);Prelucrare (Info);Inordine (Ad)Inordine (Ad) End {if}End {if}
End;End;
Traversarea în postordinepostordine este aceea în care se parcurge mai întâi subarborele stâng, apoi subarborele drept şi după aceea nodul rădăcină. Deci se parcurge arborele în ordinea (Subarbore_stâng, Subarbore_dreptSubarbore_stâng, Subarbore_drept, , RădăcinăRădăcină). Procedura Pascal corespunzătoare este următoarea :
Procedure Postordine (R:Arbore);Procedure Postordine (R:Arbore);BeginBegin
If R<>Nil Then With R^ Do BeginIf R<>Nil Then With R^ Do BeginPostordine (As);Postordine (As);Postordine (Ad);Postordine (Ad);Prelucrare (R)Prelucrare (R) End {if}End {if}
End;End;
![Page 47: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/47.jpg)
4747/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Pentru arborele următor, ordinea nodurilor corespunzătoare cele trei tipuri de traversări este următoarea :
a) în preordinepreordine : 16,7,5,2,10,9,13,20,19,25,21,29;16,7,5,2,10,9,13,20,19,25,21,29;b) în inordineinordine : 2,5,7,9,10,13,16,19,20,21,25,29;2,5,7,9,10,13,16,19,20,21,25,29;c) în postordinepostordine : 2,5,9,13,10,7,19,21,29,25,20,162,5,9,13,10,7,19,21,29,25,20,16.
1616
202077
1919 2525101055
22 99 1313 2121 2929
![Page 48: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/48.jpg)
4848/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
În exemplul următor vom genera un arbore binar prin adăugări succesive de noduri după umătoarea regulă: elementele cu cheie mai mare decât cheia informaţiei din nodul rădăcină, se adaugă în subarborele stâng iar cele cu cheie mai mică în subarborele drept. Prin traversarea în inordine a arborelui astfel construit vom obţine lista nodurilor în ordine descrescatoare a cheilor.
Informaţia pastrată într-un nod se referă la un student şi conţine media acelui student (aceasta fiind cheia după care se face ordonarea) şi numele studentului.
Program Arbore_Binar_Ordonat;Program Arbore_Binar_Ordonat; { Prgramul arbore_Binar }{ Prgramul arbore_Binar }TypeType
Tip_InfoTip_Info = Record = Record MedieMedie : real; : real; nume : string[20] End;nume : string[20] End;Adr = Adr = ^̂Tip_Elem;Tip_Elem;Tip_ElemTip_Elem = = RecordRecord
Info : Info : Tip_InfoTip_Info;;As, Ad : As, Ad : AdrAdr
End;End;Var Arb:Adr;Var Arb:Adr;
![Page 49: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/49.jpg)
4949/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Procedure Citesc (Var InfNod:Tip_Info);Procedure Citesc (Var InfNod:Tip_Info);BeginBegin
Write (' Write (' MedieMedie(>0), (>0), Nume_StudentNume_Student : ');: ');With With InfNodInfNod Do Do ReadlnReadln ((Medie,numeMedie,nume))
End;End;Procedure Print (Procedure Print (InfNod:Tip_InfoInfNod:Tip_Info););BeginBegin
With With InfNodInfNod do do WritelnWriteln ( Medie:6:2,' ( Medie:6:2,' -- ',',numenume))End;End;Procedure Creare (Var Arb:Adr);Procedure Creare (Var Arb:Adr);Var InfNod: Tip_Info;Var InfNod: Tip_Info;
Procedure Adaug (Var Sarb:Adr);Procedure Adaug (Var Sarb:Adr);BeginBegin
If If SarbSarb<>Nil<>NilThen With Then With SarbSarb^ Do^ Do
If If InfNod.medieInfNod.medie>>Info.medieInfo.medie Then Then Adaug(AsAdaug(As) Else ) Else Adaug(AdAdaug(Ad))ElseElse BeginBegin
New (New (SarbSarb); ); Sarb^.InfoSarb^.Info:=:=InfNodInfNod; ; Sarb^.As:=Nil; Sarb^.Ad:=NilSarb^.As:=Nil; Sarb^.Ad:=Nil End {if}End {if}
End;End;
![Page 50: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/50.jpg)
5050/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
BeginBeginArbArb:=Nil;:=Nil;RepeatRepeat CitescCitesc ((InfNodInfNod););
If If InfNod.medieInfNod.medie > 10 Then > 10 Then Writeln('medieWriteln('medie>10?') Else>10?') ElseIf If InfNod.medieInfNod.medie > 0 Then > 0 Then Adaug(ArbAdaug(Arb))
Until InfNod.medie <= 0Until InfNod.medie <= 0End;End;Procedure Traversare_Inordine (Sarb:Adr);Procedure Traversare_Inordine (Sarb:Adr);BeginBegin
If If SarbSarb <> Nil Then With <> Nil Then With SarbSarb^ Do Begin^ Do BeginTraversare_Inordine (As);Traversare_Inordine (As);Print (Info);Print (Info);Traversare_Inordine (Ad)Traversare_Inordine (Ad) EndEnd
End;End;BeginBeginWriteln('Se citesc medii Writeln('Se citesc medii şşi nume pana media=0');i nume pana media=0');Creare (Arb);Creare (Arb);Writeln('Elementele arborelui (lista studentilor dupa medie) :Writeln('Elementele arborelui (lista studentilor dupa medie) : ');');Traversare_InordineTraversare_Inordine ((ArbArb);); ReadlnReadln
End.End.
![Page 51: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/51.jpg)
5151/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Următorul program va construi un arbore genealogic ascendent (pentru fiecarenod se reţin informaţii despre o persoană şi legăturile de tip mamă şi tată sprenodurile respective) iar apoi se vor depune aceste informaţii într-o listă ordonatădupă anul naşterii. La parcurgerea acestei liste, persoanele vor fi tiparite în ordinea vârstei.
Program Program Arbore_GenealogicArbore_Genealogic;; {Program {Program pentrupentru strămostrămoşşiiii uneiunei persoanepersoane }}Type Type Tip_InfoTip_Info = Record= Record An_NastereAn_Nastere : Integer; : Integer; NumeNume : String[20] : String[20] End;End;
Adra= Adra= ^̂Tip_Elem_A;Tip_Elem_A;Tip_Elem_ATip_Elem_A = Record Info : = Record Info : Tip_InfoTip_Info; As, Ad : ; As, Ad : AdraAdra End;End;AdrlAdrl= ^= ^Tip_Elem_LTip_Elem_L;;Tip_Elem_LTip_Elem_L = Record Info : = Record Info : Tip_InfoTip_Info; Leg : ; Leg : AdrlAdrl End;End;
VarVar ArbArb : : AdraAdra; ; ListaLista : : AdrlAdrl; ; { { AdrAdr. . RădRăd. . arbarb.; .; AdrAdr. . primuluiprimului element }element }Procedure Procedure CitescCitesc ((VarVar Pers:Tip_InfoPers:Tip_Info);); {{CitesteCiteste in in PersPers}}BeginBegin {{informatiileinformatiile despredespre o o persoanapersoana}}
Write (' Write (' Anul_NasteriiAnul_Nasterii, , Nume_PrenumeNume_Prenume : '); : '); With With PersPers do do ReadlnReadln ((An_Nastere,numeAn_Nastere,nume))
End;End;
![Page 52: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/52.jpg)
5252/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Procedure Adaug_Arbore (Var Sarb:Adra);Procedure Adaug_Arbore (Var Sarb:Adra); {Depune la adresa Sarb, }{Depune la adresa Sarb, }VarVar PersPers : : Tip_InfoTip_Info;; { inf. { inf. pt.opt.o persoanapersoana }}Begin Begin CitescCitesc ((PersPers); ); {{sisi decide, decide, dacădacă e nod terminal e nod terminal sausau continua }continua }
If If Pers.An_nasterePers.An_nastere > 0> 0Then Then BeginBegin
New (New (SarbSarb); ); SarbSarb^ .Info:=^ .Info:=PersPers;;Write (' Mama ',Write (' Mama ',Pers.numePers.nume,' : '); ,' : '); Adaug_ArboreAdaug_Arbore ((SarbSarb^ .As);^ .As);Write (' Tata ',Write (' Tata ',Pers.numePers.nume,' : '); ,' : '); Adaug_ArboreAdaug_Arbore ((SarbSarb^ .Ad) End {Then}^ .Ad) End {Then}
Else Else SarbSarb:=Nil:=NilEnd;End;Procedure Print (Procedure Print (Pers:Tip_InfoPers:Tip_Info);); {{TiparesteTipareste informatiileinformatiile}}BeginBegin {{despredespre persoanapersoana PersPers}}
WritelnWriteln (Pers.An_nastere:6, (Pers.An_nastere:6, Pers.numePers.nume))End;End;Procedure Inserare_Lista_Ordonata(Pers:Tip_Info; Var Lista:Adrl)Procedure Inserare_Lista_Ordonata(Pers:Tip_Info; Var Lista:Adrl);; {Ins. }{Ins. }Var E, Prec, Nou : Adrl;Var E, Prec, Nou : Adrl; { un nou element }{ un nou element }BeginBegin {pt. Pers, in Lista ordonata }{pt. Pers, in Lista ordonata }
E:=E:=ListaLista;; {Se {Se cautacauta locullocul inserariiinserarii}}While (E<>Nil) and (While (E<>Nil) and (E^.Info.An_nastereE^.Info.An_nastere < < Pers.An_nasterePers.An_nastere) do Begin) do Begin
PrecPrec := E; E := := E; E := E^.LegE^.LegEnd;{WhileEnd;{While}}New (Nou); Nou^.Info:= Pers; Nou^.Leg := E;New (Nou); Nou^.Info:= Pers; Nou^.Leg := E; {Se creaza noul element }{Se creaza noul element }If E = Lista Then Lista := Nou If E = Lista Then Lista := Nou { { şşi se depune in lista }i se depune in lista }
Else Prec^.Leg := NouElse Prec^.Leg := NouEnd;End;
![Page 53: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/53.jpg)
5353/57/57
10.2.2.10.2.2. ArboriArbori BinariBinari
Procedure Arbore_Lista (Sarb:Adra: Var L: Adrl);Procedure Arbore_Lista (Sarb:Adra: Var L: Adrl); {Creaza lista L prin }{Creaza lista L prin }BeginBegin { { TraversareTraversare in in InordineInordine}}
If If SarbSarb<>Nil Then With <>Nil Then With SarbSarb^ do ^ do BeginBeginInserare_Lista_Ordonata (Info, L);Inserare_Lista_Ordonata (Info, L);Arbore_Lista (As); Arbore_Lista (Ad)Arbore_Lista (As); Arbore_Lista (Ad) End {If}End {If}
End;End;
Procedure Procedure ParcurgereParcurgere ((Elem:AdrlElem:Adrl););BeginBegin
While Elem <> Nil DoWhile Elem <> Nil Do BeginBeginPrint(Elem^.Info); Elem:=Elem^.LegPrint(Elem^.Info); Elem:=Elem^.Leg End {While}End {While}
End;End;
BeginBegin {{ProgramulProgramul principal}principal}Write (' Write (' PersoanaPersoana: '); : '); Adaug_ArboreAdaug_Arbore ((ArbArb); ); WritelnWriteln;;Lista:=Nil; Arbore_Lista(Arb,Lista);Lista:=Nil; Arbore_Lista(Arb,Lista);Writeln('Persoanele in ordine cronologica:');Writeln('Persoanele in ordine cronologica:');ParcurgereParcurgere ((ListaLista); ); ReadlnReadln;; { { TiparireaTiparirea listeilistei }}
End.End.
![Page 54: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/54.jpg)
5454/57/57
TemeTeme::
Exemplu : P(x)= 15x3-4.5x+10, Q(x)=10x2+4.5x-2, x=2; deci:
(P+Q)(x)= 15x3+10x2+8, (P+Q)(2)=168P : (15,3); (-4.5,1); (10,0); Q : (10,2); ( 4.5,1); (-2,0);
P+Q : (15,3); (10 ,2); ( 8,0);
1. Să se calculeze (P+Q)(x) utilizand iteratoriiteratori unde: P şi Q sunt douăpolinoame cu coeficienţi reali date iar x este un număr real de asemenea dat.
Polinoamele P,Q şi P+Q vor fi reprezentate sub forma unor liste simpluinălnţuite ordonate (după grad) cu elemente de forma Coeficient, Grad, Leg.
![Page 55: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/55.jpg)
5555/57/57
TemeTeme::
Lpol
↓↓Pol1 P11,P12,…, P1n
↓↓……↓↓Polm Pm1,Pm2,…, Pmn
2. Pentru o listă de poligoane date, să se verifice dacă acestea sunt convexe
utilizand IteratoriIteratori.Lista si poligoanele sunt reprezentate sub formă de liste implementate cu
cursorcursor. Lista = (Cap, CursorCap, Cursor)..
Poligonul este dat prin lista varfurilor.
![Page 56: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/56.jpg)
5656/57/57
TemeTeme::
Exemplu :
3. Să se creeze, să se actualizeze şi să se reprezinte grafic după fiecareoperaţie un arbore binar ordonat, apoi să se tipărească informaţiile acestuia in ordine crescătoare a cheii (campul de ordonare). Informaţiile din fiecare nod vorfi de forma : (Nume_persoaNume_persoanănă, , Anul_NaAnul_Naşşteriiterii), iar listarea se va face după varstă.
CataCata | 1955| 1955 TurcuTurcu | 1958| 1958 IliesIlies | 1960| 1960
PascuPascu | 1959| 1959RaresRares | 1956| 1956
Pop | 1957 Pop | 1957
![Page 57: Facultatea de Matematică și Informatică - 10. Tipul referinţăper/Fp -_-/Fp_10.pdfdinamice de acelaşi tip declarat, bine definit şi fix. Această legatură (corespondenţă)](https://reader036.vdocuments.mx/reader036/viewer/2022081410/609a6499a38fd6078e707d64/html5/thumbnails/57.jpg)
5757/57/57. . .. . . CC1010 / 7.11.2012/ 7.11.2012
SuccesSucces!!