You are on page 1of 96
& 3 a a a) i g 5 cs 3 oh Viad Hutanu Tudor Sorin ils pwr INFORMATICA INTENSIV (filiera teoreticd, profilul real, specializarea matematici-informaticd, intensiv informatica) Ciclul superior al liceului, clasa a XI-a Editura L&S Soft Bucuresti Copyright 2006 © Las SOFT Toate drepturile asupra acestet luerdri apartin editurli L&S SOFT. Cuprins Reproducerea integral sau partial a textului din aceasta carte este posibil& doar eu acordul in scris al editurii L&S SOFT. Manualul a fost aprobat prin Ordinul ministrului Educatiei i Cercetarii nt, 4446 din 19.08.2006 in urma evaluatii calitative organizate de catre Capitolul 1. Alocarea dinamic& a memoriei. i Consiliul National pentru Evaluarea gi Difuzarea Manualelor si este realizat in conformitate cu programa analitica aprobata prin Ordin al 1.1. Generalitat 4 13.02 2006. 12, Variable de tp pointer... : ministrului Educatiei si Cercetarii nr. 3252 din 13.02. 112.1 Viable dep pair in Basal 12.2, Vanable de tp porter in Gr Reforont!stingiil: 1, Abcare dnamies a merorel,. eta 2. acer aria Pc Prof. Dr, Victor Mitrana, Facultatea de Matematica, Universitatea Bucurest 1.3.2. Alocarea dinamicd in C++... Prof. grad I Valiana Patrigor, Colegiul National Bilingy George Cosbuc tibiae picpuse Raspunsut Tiparut executat la 8.0. LUMINATIPO er Str Luigi Galvani nr, 20 bis, sector 2, Bucuresti Capitolul 2. Liste liniare ...... a es 23 Anul parr: 2008 244, Defi fistelor Pree 23 22 Liste tniare alocate simp inlanflt. 24 ——$——_____ 222.1. Prezentare general... 2 Deserierea CIP a Bibliotecii Nationale n Romaniei 222.2. Crearea 3 afigarea isicior 4 2.23 Opera acura une sts | 28 HUTANU, VLAD 2.2.4 Aplicai ale lstelor linia... 34 Informaticd intensiv : manual pentru ciclul superior al toa2 come eee eres liceului : clasa a XI-a - (filiera teoretie’, profilul real, specializarea 22.43, Operali cu poinoame.... a. eater } matematici-informaticd, intensiv informatics) / Vlad Hujanu, Sorin 29. Laon este tl “39 n earea une iste Iniare aiocald dubia iia af Tudor. - Bucuresti : Editura L & S Soft, 2006 2.3.2, Addugarea unel inregistrari la dreapta....... 7 51 ISBN (10) 973-88037-0-5; ISBN (13) 978-973-88037-0-1 2.33. Adaugarea uneiinregistar a stanga.. TNs 2.3.4. Adéugarea uneiinregista in inter iste a) 1. Tudor, Sorin 2.36. Stergerea une! Ivegistal din interior iste vga 2.36, Stergerea une! inregistrari a stanga/dreapta lst 33 004075.35) 2.3.7. Listarea de ia stanga la creapta liste. {.004(075.35) 38, Listarea do la creapta fa stanga liste 2.4. Stiva implementata ca lst liniara simpiu Tnlanuit 25, Coada implementa ca ft iniaré simply ent Probleme propuse... 7 Raspunsur la testele gril. Editura L&S sort: & Adresa: Str. Stinjeneilor nr. 8, bl. 29, sc. A, et. 1, apt. 12, Sector 4, Bucuresti; Capitolul 3, Metoda Divide et Impera.........sccssseeee 3.1, Prezentare goneral8....ssess Telefon: 021-3321315; 021-6366344; 0722-530390; 0722-573701; BARE faloarea maxima dinr-un vector. Fax: 021-3321315; 3.2.2, Sortatea prin interclasar, E-mail: tsorin@Is-infomat.ro; 3.23. Sortarea rapida.. 3.2.4, Turnutile din Hanoi. Web Site: www.ls-infomat.ro. 3.2.5. Problema taieturior.. Cuprins de gratia... 3.3.1.1. Generalt (vatianta Pasca), 3.3.1.2. Generalitati (varianta C+), 2.8.1.8, Solarea culcrior gi procesul de desenare Pascal ieee) 8.3.2, Curba lui Koch pentru un triunghi echilateral 33.3, Cua lui Koch pentuun pa. 3.8.4. Arborele Probleme propuse RSpUNSUTi orn eree Capitolul 4, Metoda Backtracking, 43, rezetaren metodel a tcand se 412 Pani cre sia baza metodelboctracking. 414 Gimli immer meds tacky 411.4 Problema elon dame 42. Mal pine nin progremul sure 43 Cant meare se core osrgu sce. Eerie probleme colori Nie. 48. Aptcai sie metodo backtracking n combinatca. a. generalize itl oS 442. Proeuscaterian ; 443. Gonare at sir na rie 44.4 Generaoa combnor : 445, Generarea aranementelo 448, Gonorarea tutor partior mali (2,2 45; Aa pin proba cre exo pr lzaeamatloel aciecing. 114 154. Conor. ee 4152. Generaroa patos wel numa naturel 4150, Pteta uno sumo ou banonte dolor data. 4, Proboma bit 458 Problema bio 456, Sania cali Probleme propuse. Indica Capitolul 5. Metoda Greedy ...... 5.1, Generalitati. 15.2. Probleme peniru care matoda Greedy conduce ia sotaia orien. 5.2.1, Suma maxim’. 52.2, Problema planifcari spectacolelor... 5.2.3, Problema rucsaculul (cazul continu)... 5.2.4. 0 problema de maxim... 5.8. Greedy eurist, 5.8.1. Plata unei st 5.8.2 Séritura calull....... a tl 5.3.3, Problema comis-voiajouli. eee Probleme propuse 7 Raspunsuri / Indica Manual de Informatic’ pentru clasa a XI-a 5 Capitolul 6, Programare dinamica ...... 145 6.1. Generali . en cece ctesstct ens AB: 6.2. Problema trlunghiulul, 6.3. Subsir cresc&tor de lungime maxima... 64. 0 problema cu sume, 6.5. Problema rucsacului (cat 6.6, Distanfa Levenshtein.....0.0 6.7. Ineruitrea optima a unui gir de matrice. 6.8. Probleme cu orcinea lexicografics @ permutarilor. 174 6.9. Numérul pattitilor unei muitimi cu n elemente.. 17 Probleme propuse. i a 180 Indicati i F 183 Capitolul 7. Grafuri neorientate ... 7.4. Introducere 72. Defiita gr 7.4, Graf complet. 7.8. Graf partial, subgraf. 7.8, Parcurgerea grafurior neoreta.. 78, Graf conax. 7.9. Componente conexe. 7.0. Cietur . 7.11. Cicks eulerian, graf euierian.. 7.12, Grafurl bipartite... 7.18. Grafuri hemiltoniene. Capitolul 8. Grafuri orientate ........ 8.1, Noflunea de graf orientat...,. 8.2. Memorarea graturior orientate 8.3, Graf partial, subgra........ 8.4, Parcurgarea grafurlior. Drumur, Circuito, 8.5. Graf complet si graf tumeu. 8.6. Graf tare conax. Componente tare conexe. 8.7, Drumuri de cost mintth.c.rnu fs 8.7.1. Introducere.... 8.7.2. Algorimul Roy-Floya.. 8.7.3. Utlizarea algoritmul Roy. Floyd pont Programul va utiliza atéta memorie cat are nevoie. Nu intotdeauna se poate cunoagte, de la inceput, de cat memorie are nevoie, aceasta se decide in timput executari, in functie de datele de intrare. In plus, daca o variabilé nu mai este necosara, exist& posibilitatea sa eliberam memoria ocupata de aceasta. O astfel de abordare conduce ia micgorarea substantial a necesarului de memorie a unui program. Capitolul 1, Alocarea dinamic’ a memoriei in varianta Borland a limbajelor Pascal gi C++, memoria din segmentul de date nu este intotdeauna suficient’, ea este limitata la 64K. Apoldnd la Heap, se mareste memoria disponibila. Anumite structuri de date, pe care le vom studia in am@nunt, se implementeazé cu usurinté in Heap. Un exemplu In acest sens sunt listele liniare, dar acestea sunt prezentate in capitolul urmaitor. 1.2. Variabile de tip pointer 1.2.1, Variabile de tip pointer in Pascal ‘Am ‘nvitat faptul c& memoria interna poate fi privita ca o succesiune de octetl, Pentru ai distinge, acestia sunt numerotati. Definifia 1.3. Numarul de ordine al unui octet se numoste adresa lui. Orice variabila ocupa un numar de octeti succesivi. De exemplu, 0 variabita de tip integer ooupa doi octefi, variabitel, RB Definitia 1.4. Adresa primului octet al variabilei se numeste adresa Observatie. Nu trebuie confundats adresa unei variabile cu valoarea pe care aceasta 0 memoreazal Memorarea adreselor variabilelor se face cu ajutorul variabilelor de tip pointer. = Variabilele de tip pointer se caracterizeaza prin faptul c& valorile pe care le pot memora sunt adrese ale altor variabile. Ele nu pot fi citite, nu pot fi tiparite in mod direct gi, cu 0 exceptie, continutul lor nu poate fi modificat in uma unor operatii aritmetice (de exemplu, nu puter incrementa o asttel de variabild), Limbajul Pascal face distinetie intre natura adreselor care pot fi memorate. Asttel, exist adrese ale variabilelor de tip integer (formand un tip identificat prin sintagma uzuala "pointer cétre variablle de tip integez”), adrese ale variabilelor de tip real (‘pointer catre variabile de tip rea"), adrese ale varlabilelor de tip string ("pointer cétre variabile de tip sting”). Din acest motiy, tipul pointer esto variat. 1 Tn ultimele versiuni ale celor dou jimbaje, memoria din segmentul de date nu mai este limitat&, ci se poate folosi Intreaga memorie disponibila. Din acest punct de vedere, daca se folosesc aceste versiuni, avantajul "memoriel in plus* nu mai poate fi luat in considerare. Manual de informatica’ pentru clasa a Xi-a 9 > && Tipul unei stfel de variabile pointer se declaré ca mal jos: type nune=*tip. 1, Veriabile de tip pointer catre variabile de tip integer. Varlabilele agri, aax2, pot refine adrese ale vatiabilelor de tip intreg. type adr_ints*integer) var adrl,adr2:adz_int) numariinteger) Foc ® Variable de tp pointer catte variable de tip reat. Variable adrewa, b v poate refine adrese ale variabilelor de tip real. type adi : var adzeaa: adz_real; _ 3. Variablle de tip pointer catre variabile de tip inreg. Tipul inzeg este tip record. Variabila adr_inz, poate retine adrese ale variabllelor de tipul inreg. type inregerecord pune rstring[10]7 prenune:string{10]; varata:byte; end; type adr_inregs*inreg: var adr_inrtadr_inreg Observatii intre variabilele de tip pointer sunt permise atribuiri doar tn cazul in care au acelagi tip pointer (retin adrese catre acelagi tip de variabile).. Exemplu: adri, adr2:Sinteger; adr3! *real: Atribuirea adri:=adea este corect4, iar atribuirea adr3:=ade2 nu este coracta. Chiar gi in cazul in care avem tipurile identice, dar descrise diferit, atribuirea nu este posibild. Atribuirea din exemplul de mai jos este eronat, Exemplu: type adrosentintegers var adeliadzese; adraisinteger; adr2inadedy 10 Capitolul 1, Alocarea dinamicé a memoriei Pentru a obfine adresa unei variabile oarecare se foloseste operatorul “a” prefixat. Adresa va fi memorata de o variabii’ pointer catre tipul variabilel a cael adresd a fost returnata de operatorul “e", Pomind de la o variabil& de tip pointer care memoreazi adresa unei variabile, cu alutorul operatorului “*", posttixat, se poate adresa continutul Variabitei a cérei adresd este memoratd. 1. in programul urmator, variabilel x, care este de tip intege: airibule valoarea 3. Variabilei a, de tip pointer catro integer, i se atribule adresa lul x. Pornind de la continutul variabilei a, se afiseaza continutul variabil type adrint=*integer; var a:adzint xtintegers begin t=) arndac; weiteln(a*); ena. 2, in programul urmator, variabilei v, de tip tnxeg, | se atribuie o valoare. Variebilei adresa, de tip pointer catre tnzeg, ise atribuie adresa lui v. Pornind de fa continutul variabi . 8@ afigeaza continutul variabilei v. type adrinreg="inreg; Enregerecord numeratcings varsta:integers end; need? adresa:adrinreg; weiteln(adresa*.nune,' ', adresa*.varsta); ond, Manual de informatica pentru clasa a Xl-a u 1.2.2. Variabile de tip pointer in C++ ‘Am Invatat faptul c& memoria intema poate fi privita cao succesiune de octeti, Pentru 2-idistinge, acestia sunt numerotati Dofinifia 1.3. Numarul de ordine al unui octet se numeste adresa lui. x rice variabila ocups un numar de octefi succesivi. De exemplu, 0 Variabilé de tip Ant ocupa doi octefi (in varianta Bortand C++ 3.0). GS Definitia 1.4. Adresa primului octet al variabilel se numeste adresa variable f Observatit ¥ —Nutrebuie confundats adresa unel variable cu veloarea pe care aceasta 0 memoreazai Y-Uneori in Jo do adresa a unel variable vor folos termenul pointer! Memorarea adreselor variabilelor se face ou ajutorul variabilelor de tip pointer. = Variabilele de tip pointer se caracterizeaza prin taptul c& valorile pe care le pot memora sunt adrese ale altor variabile, Limbajul C++ face distincffe intre natura adreselor care pot fi memorate. Astfel, exist adrese ale variabilelor de tip int, adrese ale variabilelor de tip float, adrese ale variabilelor de tip chax, eto. Din acest motiv si tipul variabilelor de tip pointer este diferit. = Tipul unei variabile de tip pointer se declar’ ca mai jos: tip *nune. 1. Variabile de tip pointer c&tre variabile de tip int. Variabilele adr gi ‘ade2 pot retine adrese ale variabilelor de tip int. Privii declaratia de mai jos: dnt tadri, *adr2; 2. Variabile de tip pointer catre variabile de tip £1oat. Variabila adresa, poate refine adrese ale variabllelor de tip Eeat: float* adress; 2 Capitolul 1, Alocarea dinamic& a memorlei 2) 3 Variabite de tip pointer catre variabile de tip eLev, care la réndul for Exc: suntde tip weruet. Variable a gi b, pot retin adrese ale variabillor de tipul etev. struct elev {char mune [201, prenuna[201; float nota_nate, nota_infor int varstar ” elev “a,b; L Obsorvatii Y — Caracterul “s* poate fi agezat in mai multe feluri, dupa cum se observa: Ant* adety int * adriy int tadri ¥ Pentru a declara mai multe variabile de acest tip, caracterul "*" se trece de fiecare data: 7 int *adri, ‘adr2, *adr3; Y — Odeclatatie de genul "int* ade1, ade2y" are semnificatia cA adr este de tip pointer cétre ane, in vreme ce adr2 este de tip int. Atentle! Aici se greseste deseor => Adresa unei variabile se obfine cu ajutorul operatorutul de referentlere “e", care trebuie s& preceada numeie variabilei: aNume_variabilay adrisknumar; - variabilei adr | se atribuie adresa variabilei numar. Ex: = Fiind dat& o vatiabilé de tip pointer catre variablle de un anume tip, care memoreaz’ o adresa a unei variabile de acel tip, pentru a obfine continutut variabilei a cérei adres& este memoratd, se utlizeaz’ operatorul unar “*", ‘numit gi operator de dereferengiere. 1. Variabila a este initializata cu 7, lar variabila eax este initilizaté cu adresa lui a. Secvenfa afigeazé confinutul variabilei a (7), pornind de la adresa ol, retinutd de ade: Ant ae7, tadrecay cout<". Acesta accoseazé un camp al unei structuri pornind de la un pointer (adresa) catre acea structura. El are prioritatea maxima - vezi tabelul operatorilor. Tipdrirea se poate face si aga: cout <prenune; ‘inte variabile de tip pointer sunt permise atribuiri doar in cazul in care au ‘acelagi tip pointer (retin adrese c&tre acelasi tip de variable). Exemplu: int *adri, raara) float vadr3; 77 Anivializart Atibulrea “adrisadr2" este corecta, iar atribuirea ‘adr3=adx2" nu este corecta. In aceste condi, va puteti intreba: cum putem atribui continutul unei variabile de tip pointer catre tipul x, altel variabile de tip pointer c&tre tipul y? in definitiv, amandoua retin 0 adresé... in acest caz, se utilizeazé operatorul de conversie explicita. De aceasta dat’, pentru exemplul anterior, atribulrea: *ady3=(£loat*)ade?" este corect’, 14 Capitolul 1, Alocarea dinamica a memorlei 1,3. Alocarea dinamica a memoriel 1.3.1. Alocarea dinamica in Pascal ‘Anumite variabile pot fi alocate dinamic. Asta inseamna &: > — Spatiul necesar memorarit este rezervat Intr-un segment special destinat acestui scop, Numit HEAP. > Rezervarea spatiului se face in timpul executéri programului, atunci cand se ‘execut’ 0 anumit’ procedurd, sorisé special in acest Scop. > Alunci cénd variabila respectiva nu mai este uti, spatiul din memoria este eliberat, pentru a fi rezervat, daca este cazul, pentru alte variabile. jin Bortana Pascal, pentru alocarea dinamica se utilizeazé urmatoarele ov’ proceduri: -— Procedura New alocé spatiu in HERP pentru o variabila dinamic’. Dupa ‘alocare, adresa variabilei se gaseste in P'. procedure Wew(var Pi Pointer) -— Procedura Dispose elbereazé spatiul rezorvat pentru variabila a caret adres este refinuté in p. Dupa eliderare, confinutul variabilei P este nedefinit. procedure Diapose(ver P: Pointer) Mecanismul alocarii dinamice este urmatorul: «Se declara o variabilé pointer, s-o numim B, care permite remorares unel adrese. «© Ge loc’ variabila dinamica prin procedura New, de parametru P. in Umma alocéril, variabila P retine adresa variabilel alocaté dinamic. © rice acces Ia variabila alocata dinamic se face prin Intermediut variabitel P. p segment de date Figura 4.2. Accesut la varabla alocat® dinamo 7 pack au exietd spaiu in MEAP, P rtine mi (rii o valoare). In practic, tntotdeauna se face tostit cenenje!spayuiui_Dn motve didactie, pent a nv cempea programete n exerplels pe cere le vom ‘da nu vor fest existenfa spatilul In HEAP. Manual de informatica pentru clasa a Xl-a 15 = — Pentru a elibera spatiul ocupat de o variabila di ti inamica, @ cdrel adres’ se GAseste th P, se uilizeazd Dispose, de parametru P. Dupa eliberarea spatiului rezervat pentru vatiabila data, conjinutul variabilei p este nedatinit. > Flind data o variabité de tip pointer catre varlabite d t fe un anumit tip, pentru a aeosea cont variable! cate) adresé este momorats, 0 tizears ‘numele variabilei de tip pointer urmat de operatorul "*", 1. Variabile de tip pointer catre variabile de tip integer. Variabilole adr. si adr2 pot refine adrese ale variabilelor de tip intreg, type adr_int="integer; var adriiadr_ints {eau adri: integer prin renuntaroa 1a prima linie} Roviedst) (aloe apatin in MEAP pontmu o vartabite shoe op ite de tio aarttie7) arishlia retine 7) Weltoin(ader) { Elparose continitul acostel variabite dispose(adr) {eliberez spatiul) eriapiie (>) 2, 2. Vertiabile de tip pointer catre varabile de ti ip real, Variabila adress, GE: Fema ene arese de varehierdeip reste ne Mares type adr_real=*reals var adreaa: adr_real; new(adresa) + adresa’1=7.65; writeln(adresa’s412)7 3. bare de tip pointer catre variabile de tip inreg, care la randul lor, sunt de tip xecord. Variabila adr_ine, i 2 variabilelor de tipu! inreg. Ser Peres erate eet type inregerecord ume :stzing{10] 7 prenume:string{10]; varsta:byte; end; adr_inrege*inreg; var adviade_inxeg: begin Feadln(adr*.nune) ; roadin(adr*.prenune) ; roadin(adr*.varsta) ; writen (ade* mune); writeln(adr*.prenume) ; writeln(adr*.varsta); Capitolul 1. Alocarea dinamici a memorie! 4, Programul urmator citeste gi afigeazé o matrice. Nou este faptul oa matricea este alocata in HEAP. type matricosarray[1..10,1..10]of integer; adr_mat=*matrice; var adciadr_mat) myn, i, jrintegers begin weite('me') ;readin (a); write('ns') ;readin(n); new(adr) 7 for itsl to m do for Jr=1 to n do readin(ade*{4,31)7 for ital to m do begin for J:sl ton do write(adrs{i,j}14)7 weiteln; ena; ena, 5, Este cunosout faptul o& functile nu pot Intoarce decat tipuri simple. Prin turmare, 0 functie nu poate intoarce o matrice care este descrisé de un tip structurat, Dar tipul pointer este simplu. Aceasta inseamna ca o functie poate intoarce un pointer. in cazul in care avem un pointer catre 0 matrices (retinuts in mear) se poate spune, prin abuz de limbaj, c& 0 tunctie intoarce 0 matrice. Programul urmator citeste doud matrice si afigeaze ‘suma ior. Matricele sunt rezervate Tn HEAP. type matricesarray[1,.10,1,.10]of integer; adr_mate‘natrice; var adrt,ade2,adz3:adz_mat; myn:integer; function cit_Mat (m,n:integer) iadr_mat; var i,jrintegex; adrradr_nat) begin new (adx) ; for diel to m do for Jre1 to n do roadin(adrs{i,J3)7 cit_Matieadry endy function Suma Mat (adri, ade2rade mat) :adz_mat; var i, jrinteger; aderadr_mat; begin new (ade) 7 for Lil to m do for Ji=l to n do ade*{i,S]smaded*{i,j]+ade2*(i,d17 Suna_Matreadr) end; Manual de informatic& pentru clasaaXI-a___ v7 procedure Tip_Mat (ade:adr_mat); var i,j:integers begin for i:e1 to m do begin for Jj writeln; end end; begin write (‘ms'); readin(m); write('ns')) readinin); aGrir=Cit_Mac (myn); adx2:=< aGr31=suma Mat (adei, ade2) ; ‘Tip_Met (adz3) ; end. ton do write(ade*{i,j1:4); 1.3.2. Alocarea dinamica in C++ In c++, pentru alocarea dinamicd se utiizeaz’ urmatorll operator: = Operatorul mew alocé spatiu in REAP pentru o variabiki dinamica. Dupa alocare, adresa variabilel se atribuie lui #, unde P este o variabilé de tip pointer catre tip’: Penew tip. Observatil Numérul de octeti alocati in HEAP este, evident, egal cu numérul de octeti ccupat de o variabila de tipul respectiv. Y — Durata de viaté a unei variabile alocate in HEAP este pand Ia ellberarea spatiului ocupat (cu delete) sau paind la stérsitul executrii programulul = Operatorul deete elibereaz spaliul rezervat pentru variabila a c&rel adresa este rotinuta in P. Dupa eliberare, continutul variabilei P este nedefinit. delete P. 1. Vatiabile de tip pointer catre vatiabile de tip int. Variabila adxt poate ‘feline adrese ale vatiabilelor de tip int. int® adriy adri-new int; // aloc spatiu in MEAP pentru o var. de tip int ‘adei=7; //variabila alocata retine 7 cout struct inreg ‘Cobar mune (201, prenume (20); este Interpretatd ca masiv cu £71181 {81 componente de tip float. in int varatay concluzie, este masiv cu componente de tip pointer si nu pointer catro y i masive. Atentle! Aici se fac multe confuzi main() { inreg* adr; > Intrucat numele unui masiv p dimensional este pointer catre un masiv p-1 adr=new inray cin>>adr~>nun>>adr->pronune>>adr->varetay 4 Cont scade->nuna condi prenunevaratay Gimensional, pentru a aloca dinamic un masiv se va utiliza un pointer catre masive p-2 dimensionale (ultimele p-2 dimensiuni). 1. Alocéim in HEAP un vector cu 4 componente de tip ant. Numele unui Mecanismul alocarii dinamice E2x: ates do vector are tipul Ant (pointer eatre-Ant). Prin urmare, variabila a 7 are tipul int*. Dup8 alocare, ea va contine adresa primului element al in continuare prezentém mecanismul alocarii dinamice a masivelor. Pentru vectorului din HEAP. Din acest moment, pornind de la pointer (retinut in a) ‘inceput, vom prezenta pe scurt legalura intre pointer gi masive, vectorul se adreseazd exact cum suntem obignuiti. =» Un tablou p-dimensional se declara astfel: ats eee Ant laly tip numetn,] tnd... i erence lee ‘Observati modul in care a fost trecut tipui in dreapta operatorului new. Exemple Y Practic, dectararea tipului se face Intocmai ca deciaratia masivului, ins’ + float A(71 [4] [217 ~ am declarat un tablou cu 3 dimensiuni, unde f peinele 2 teat ernie tipul de baza este float. + long b{91{7] [8115]; - am deciarat un tablou cu 4 dimensiuni, unde tipul de baz este Long. Gy, 2 Dectaram in MEAP o matrice (masiv bidimensional) cu 3 tll si S =X coloane, cu elemente de tip double: double (*a) [S]=new double (31517 = Numele tabloulul » dimensional de mai sus este pointer constant catre un ec tablou p-1 dimensional de forma tna}... [mg], care are componentele de : baza de acelas! tip cu cele ale tabloulu. Exemplele de mai jos se refera la = in cazul masivelor, trebuie atentie la eliberarea memoriei (cu deiete) tablourile anterior prezentate: Trebuie {inut cont’ de tipul pointerului, aga cum rezulté din exemplele urmétoare. + A. este pointer constant céire tablouri cu 4) [21 componente de tip float; zs 1. Fie vectorul alocat in HEAP, int *a snew int {41;, Dacd incercém = este pointer constant céitre tablouri cu £71 £81 £51 componente de tip E26: dezciocarea sa prin: deteve. a), i dozalocdm prima componenta, pent Long. c pointerul este de tip int = Un pointer catre un tablou x dimensional cu {1s} {1,]... Cad Corect, dezalocarea se poate face prin: "delete [4] a7" - eliberam ‘componente de un anumit tip se declara astfet spafiul pentru toate componentele (in acest caz avem 4). Observati c& tip (*nume) (2) (a)... Eh) operatorul deiete se poate utiliza si ca mai sus. 20 Capitolul 1, Alocarea dinamic& a memoriel 2. Fie matricea alocata in HEAP; double (+a) (5151 jew double [3] [5]? Eliberarea spatiulul ocupat de ea se face prin "“detete [31 1 Aplicatia 1.1. Programul urmator citeste si afigeazai o matrice. Nou este faptul c& matricea este alocata in RAP. #include main() (dnt myn, 4,4, (fade) £2037 adrenow int [10] {0]7 cout<>my cout<ony for (inOsicmire) for (Je0;3>adr (4) (313 for (in0;Lcmyie+) ( for (Jx0;jensje+) coutscadrlil [i1 cout< vold* Cit_Mat (int m, int n) (int i,4) (*adet) [10]=new int [10] [2017 fox (i#0)i>adet (4) [517 return adri; y void Tip_Mat( int m,int n,int (*adrt) {10)) (int 4131 for (4=0;4emi++) ( for (ud;jensi++) coutcendrt [i] [5]<<" "y cout< void* Suma Mat( int m, int n,int (*adei) (101, int (ade2) (10]) (int 4,4, (adr) (101 =new Ant {10} (2017 for (is0jdemjive) for (J=0;3cns3++) eds [4] [J] =adrd (4) [J]+adr2 (4) (512 veturn adry » Manual de informatic& pentru clasaaXl-a Fl main() {int men, 4,3, (rade) (20), (fadeL) (10) , (adr2) (201 7 cout< cima"? ein>>m; coutccna="7 cindony adri=(int (#) {10} }cit_ Mat (m,a) 5 adr2=(int (*) [10] )cit_Mat (m,n) > agra (int (*) (10) )Suma_Mat (m,n, adri,adr2); nip Mat (mn, ade) : Probleme propuse 1. O variabila de tip pointer cétre tipul integex/int poate memora: a) un numar intreg; 'b) confinutul nei variabile de tipul integex/int; ) adresa unei variabile de tipul integer/int. 2. Fle declaratille urmatoare: Ee Varianta Pascal “Varlanta Cre” type adrint="integer; int tal, *027 adzreal=*ree]7 float “a3; var al,a2:adrint; asiadrreal; Care dintre atribuirle de mai jos este corecta? a) atee7.35; a) aie7.35; b) a3te7.357 b) 0387.35) ) a2i=a3; fe) azeasy @) atssaa a) ateaa; 3. Ce Intelegeti prin HEAP? a) un segment din memorie; 1b) tipul variabileior care retin adrese; ) ovariabilé de sistem in care se pot retine date de orice tip, 4,, Rolul procedurii new / operatoruiui new este: a) deacreao adress; b) dea aloca spatiu pentru o variabilé la 0 adresa dats; ¢) dea aloca spatiu Tn EAP pentru o variabil& de tip pointer; 4) dea aloca spatiu in HEAP pentru o varlabila de un tip oarecare, 22 Capitolul 1. Alocarea dinamic& a memoriei —________apitolul 1. Alocarea dinamica a memoriei 5. Rolul procedutii dispose / operatorulul delete este: 1a) dea sterge continutul unei variabile; b) dea sterge continutul unei variabile alocaté tn HEAP, alocaté in MEAP; 4) dea ellbera spetiul ocupat de o variabila oarecare; 2) dea sterge variabila a care adresa se gasagte memorata in MEAP. 6. Ce se afigeaza in urma executarii programulul urmator? type adrreal="real; include var ai, a2:adrreal; nain() begin C float tat, raz; mew(ai); ai*:937 aisnew float; *aL<3; new (a2); a24:=67 a2imad; writela(a2*:310)) ») 3; ¢) Eroare de sintaxa, 7. Ce se afigeazé in urma executéirl programului urmator, daca se citesc, in aceasta ordine, valorile 7 gi 8? type adzreal=sreal; Hinclude var al, a2,mantadzreal; main() begin Cine #02, #02, ¢man; mew (a1); readin(ai*); atenew int; cin>>*al; new (a2); readin(a2"); A2enew int; cin>>*aa) man:=a2; man=02) egrsal; azeal; ali=man; alsman; weiteln(al*:1:0," ',a24:1:0); couteetance” "< in-cazul listelor, prin acel pointer se poate accesa numai primul element al liste, Apoi, porind de la acesta se poate accesa al doilea element al liste, samd. > — Ulimut element al listei va avea memorat in c&mpul de adresé o valoare cu semnificatia de nici o adresa. Cu ajutorul acestet valori programele vor detecta sfargitul iste. in Pascal, aceasta valoere este nit, iar in C++ ea este 0 Crearea listelor Initial, o variabilé v refine ni. / 0. Presupunem cd, la un moment dat, lista este cea de mai jos, iar v refine adresa primului element (adx,): CO PT] adr; adry adr, v Daca se citeste un nou numar (de exemplu 4), atuncl acesta se adauga intr-o Inregistrare afiat& la Tmceputul liste, In urmatoarele etape: ‘8) Se aloca spatiu pentru noua inregistrare, se completeazé cémpul numerio, iat adresa urmatoare este cea din v, dec! a primului element al liste, Adon ») Vatiabila v va memora adresa noil inregistréri: Programut este prezentat in continuare: 26 Capitotul 2. Liste tiniare “Varianta Pascal, == |) VarlantaCts type Adreaa=*Nods #include Nod=zecora Snfo:ineagers ce adr_urmiAdresay fod* adr urmy fase 5 et aden var viadresay , arrinteger woa* vy procedure Adaug(var v:Adresa; are aritnteger); | void adaug(Nod*e v, int nr) var crnsresas {Noa cxnew Nods begin en>infosney new(e) eovade amavis er sinforenry ver ar_urmi=vi ? void Tip(sod* v) { Wod* c=vy while (c) { coutinfoccendly eze~radr_urmy ) begis - =a ee asin ribet fot indo} Galette Sisco is end; | { Adaug(v.nr): ie i‘ ces cemelas ; toe adaug (v, m2) ¢ weite(‘numars'); readin(nr) ; end) tipi); end. ff. inPescal, nu este permis, ca in C++, s& definim un tip care confine dectarari cee refera la el. Spre exemplu, deciararea de mai jos Nod = recora inforintegers ‘adr_urm = “Nod ends este gresité. Campul adz_uxm face parte din tipul Nod si este definit ca pointer catre acelasi tip (Nod). Conventia de limbaj este s& se declare pe nd cele doua tipur, ca in program. Procedand dupa algoritm, lista va confine informatie in ordinea invers’ tn care au fost introduse. Acest fapt nu prezinté importanta pentru majoritatea aplicatilor. Manual de informatica pentru clasa a Xi-a 27 Un alt algoritm de creare a listel, recursiv, este prezentat mal jos. De aceasti data lista cuprinde intormatile in ordinea in care acestea au fost iniroduse: a6 “Varianta C+ type Adrosa=*Nody include Noderecora infor integer; en adr_urm:Adresa; eet sae Boat names 37 var vingrean; moat v7 tunction adsugsnaresa: Noa adang() wer ciadresay (toa er nevineeger: tne ney begin coutcermumar “7 cim>onr: este ('nra')7 xoadin(ne); fan Af nrc then omen (aoa): begin cvpadeurmngaug() aw(o) copintonny sang =or Setumn cp Bang" intor=nry ) Gauge adr ummsendaug else return 0; > void Tip(wod* v) ond adaug:=nil; lat rig tot oeceade 26 Seca ectecura ; ate ; Meee ( veadaug(); ; et ay a Mal jos este prozentat un subprogram recursiv care tipareste informatie in ordine invers& fata de modul in care se g&sese tn list&: lanta Pascal: [eee Nai procedure Tip_inv(viadresa); void Tip_inv(Nea* v) begin \eie w 4£ veonil then | C tip inv (v-radr_uzm); begin cout<infoccendl7 ‘pip_inv(v*,ede_urm); y writoln(v* info); ? ond; ondy 28 Capitolul 2. Liste finiare © Problema 2.1. Fiind daté o lista liniar’ simplu inlantuité, cu adresa de Inceput v, se cere s& se inverseze legaturie din lst’, adic’ dacd fn lista initala, dupa nodul 4 urmeaza nodul +2, atunei, in noua lst’, dupa nodul 4+, urmeazé nodul 4. © Rezolvare. Functia inv, rezolva problema data. Ea are doi parametri: adresa primului element al lstei (pred) si adresa urmétorului element din listS (cuxent). Practic, la fiecare pes, partea de adres a nodului referit de curent va refine adresa refer de pred (adica adresa nodului precedent), Functia retumeaza adresa primulul nod al liste inversate (adica a ultimului nod in cazul liste! neinversate). inainte de pelul functiei, partea de adress a primului nod listel va trebui s& reliné nil /0. : -VariantaPascal | ~ Varlanta Cr+ function inv(pred, curent: Nod* inv(Hed* pred, ‘adresa) raéresa; Wod* curent) var urniadresa; (Noa urns begin while (curent) while curentcnit do { urmscurent->adr_urmy begin curent->adr_urm=pred; ‘urm:scurent pred=curent} curent=urm) » return predy > Nod* curentev-rade_usmy y->adr_urm=0; Any (¥,curent) + curent :ny*.adz_urmy wh ade_urmienil; Tp); vieinv(y, curent) ; Biptw): 2 Exercitiu. Modificati subprogramul astfel incat acesta s& alba un singur parametru, adresa de inceput a listel. 2.2.3. Operatii asupra unei liste liniare ‘in acest paragrat prezentam principalele operatli care se pot efectua cu 0 Hist liniara simpiu inlanquit, J in prozentarea operatiilor, vom folosi de multe ori desene. Retinefi: pentru orice operatic aveti de efectuat, faceti un mic desen. Va ajuta mult... Orie list’ va fi retinuta prin doua informatii de adres: a primului nod (w) sia Ultimulul nod (s£). Precizém faptul c8, in general, numal prima informatie este indispensabils. Pentru simplitate gi pentru rapiditatea executarii vom refine gi ‘adresa ultimului nod, Structura unui nod al listei este: Manual de informatic& pentru clasa a Xl-a 29 Varlanta Pascal 7 Varianta Cee struct Nod (nt infos Nod* adr_urm; Hu A. Adaugarea unui nod Flind data o lista liniard, se core s& se adauge la sfarsitul ei un nod, cu 0 ‘anumité informatie, in exemplele noastre, un numéir intreg. Se disting dou’ cazuri: a) lista este vida - v retine 0. S8 presupunem o& vrem s& adiéug’im un nod cu informatia 3. Se alocd in HEAP nodul respectiv, adresa sa va fi inv, si cum lista are un singur nod, adresa primului nod este gi adrosa ultimului, deci continutul lui v va coincide cu acela al lui sf. ») lista este nevida Fie lista: Campul de adres al ultimului nod, cel care are adresa in ef, va retine adresa nodului nou creat, dupa care si sf va refine aceeasi valoare. 30 fost necesar s& parcurgem introag adresa ultimului. Capitolul 2, Liste liniare Dacd n-am fi utllizat variablla a€ pentru a refine adresa ultimulul nod, ar fi a list’, pornind de fa v, pentru a obtine procedure Adaugare(var v, Adresa;val:integer) 7 va lade_urmrenily fieve ona else begin Wow (c) 7 af*adr_urmise7 et -inforevaly of adr_urmienil; sfiser ona ond; Nod*a sf, int val) { Moat 7 Lf (vero) { venew (Wod) ; vepinforvaly vo>adr_urm=0) atevs ? else ( cenew (od) 7 af->adr_urmec; e->dnfoaval o=>adr_urm=07 | afser B. Inserarea unui nod, dupa un altul, de informatie data Fie lista din figura anterioara. Dorlm s& adéugéim dupa nodul cu informatia 3, un altul, cu informatia 5. Initial, se identific&’ nodul dupa care se face adaugarea. in cazul de fala acesta este primul. Se alocd spatiu pent tru noul nod. Se completeaza adresa gi anume adresa nodului care urmeaza dupa cel de informatie 3. Apoi, cAmpul de adresa al nodului nou creat: ETE cu informatia 3 va refine adresa nodului ‘Manual de informaticd pentru clasa a Xt~a 31 Un caz aparte apare atunci cand nodul de informatie vai este ultimul in iota. in acest caz we va retine adreca nodului nou creat pentru cd acesta va fi ultima “Varianta C++ void Inserare_dupa(Nod* v, Nod*a af, int val, int val1) { Nod" cay, "47 walle (c->infoleval) viadresayvar sfiadresa; val,valitinteger) + var ¢,diadresa; Guede ae ens begin denew Nod orev @->info=vall? walle o*.info @s adr_urmisc* .ede_urmy oh adr_urmi=dy Af d*.adeurmenil then afied) ondy d->adz_urm=c->ade_uzm; e-padr_urm=4; Af (6->adr_urm==0) sf=d; SES ee ES eee ee eee REE EERE EEE EEE ©, Inserarea unui nod, inaintea altuia, de informatie data Intrucat operatia este asemanatoare cu precedenta, prezentém numai subprogramul care realizeaza operatia respectiv’: procedure inserare_inainte(var viadresa;val,vail:integer) 7 var c,dradresa void Inserare_inainte(wod"e v, int val, int vali) (Coat 6, #47 begin’ Af (y->dnfoxeval) Lf va.Anforval, { d=new Nod ‘then’ d-rinfo=vali; begin d->adz_urm=v? ‘new (a) 7 ved as dnfosevali; d 4 adr_uraiev; else vied Ceevy while (c->adz_urn-> infoleval) Gxc->adr_uray d=new Nod; d-rinfosvalt; d->adz_umn=o->adz_usny revs while ¢4.adr_urm*.infoo val do cime*.ade_urmy e-vade_urmmdy new (a) 7 ) 4*.inforevalty > 4 vadz_urmi=o% .ade_urmy of adz_urmi=dy ona) ona; 32 Capitolul 2. Liste liniare Manual de informatick pentru clasa a XIna 33 D. Stergerea unui ned de informatie data Seesiat T crevt while (c->ady_uam->info Algoritmul este diferit in functie de pozitia tn list’ a nodului care va fi sters - while ct .adx_umm’.infocoval ssvaujoescsneacigcar daca este primul sau nu. do crech adr weny manzo->ade_urmy z : mant=c*.adr_urn; ¢->ady_urmeman->adr_urmy a) Nodul nu este primul. Pentru nodul care va fi sters, informatia de adres a : c*.adx_urmieman* .adr_urm; predecesorului va reline adresa nodulul succesor: 4 if man=sf then af:=c; ends delete man; ——— ieee a Memoria ocupat de nodul care urmeaza a fi sters este eliberatd: Pentru a verifica modul de functionare a subprogramelor de mai sus, este hecesar sa utiizam un altul, care afiseaza lista liniara : - Varianta Pascal Varianta C++ i: procedure listare(v:adresa); | void Listare(Nod* v) ' var o:Adresa; (Nod* o=v; : agin while (e) 1b) Nodul este primut. Fie lista Shite conti do cout cco->infoccandd) begin enc-sade_urmy og ce cise .adz_urmy cout Variabila v va retine adresa celui de-al doilea nod: ; ee Acum putem testa aplicatia, Utilzai seoventa urmatoare: : Varianta Pascal oy _. Varianta C++ var v,se:ndzesay Nod v7, 961 | Tiincogers ine fy | agin pein for tr=1 to 10 do (for (ints Leat0;4s4) aaugare (88) ‘Adaugare(v, 26,1) Lister) uiseare (ey? innerare dpe 38,7,12) Tnsorare.dupa(v,£,7,11)7 Programul este urmatorul: _dupa (v, s£,10,12) 7 Inserare_dupa(v, sf, 10,12) ineorare.cupa (7, a£;2,13)3 Tnserare_dupa(, ef, 1,43) Ea eee Liseare(v)y Eiseare(@s sii Varlanta Pesost se Natlanta Gr ea é inserare_inainte(v, 13,14); Inserare_inainte(v, 13,14); procedure Sterg(var v, void Sterg(Nod*% v, Nod"& sf, a inserare_inainte(v,1,15); Inserare_inainte(v,1,15)7 sfradrecayvai integer)? ne val) Lsearece) ciseare(s7 var c,man:adresa; { Noa* c, *many 1 sterg(v,ef,15)7 Sterg(v, s£,15)7 begin Te (y-binfomevad) | Seoratvat13)1 Stora (v.0f,33)) TE vAstnfoeval then manevs i beeru ey 08,2 Seera(vs 8.42) begin vewevade rm | Tataretwys mocare(w)s Tmentevy vie? ade sem , j ond, , ona 34 Capitolul 2. Liste liniare 2.2.4. Aplicatii ale listelor liniare 2.2.4.1, Sortarea prin insertie Se citesc de la tastaturd n numere naturale, Se cere ca acestea sti fie sortate crescétor prin utlizarea metodel de sortare prin inserfie. Aceasté metoda de sortare a fost studiat’ tn clasa a 1x-a. Ideea de baz a ‘metodei const in a considera primele % valori sortate, urmand s& inseram valoarea k+1 in sirul deja sortat. Prin utiizarea listelor liniare inlantuite, inserjia este mai simpla, intrucdt nu necesité deplasarea componentelor, ca in cazul vectoriior. Pentru simpificarea algoritmului, lista va confine valoarea maxim’ Maxrnt elocaté doja in lista, in acest fel, algoritmul se simplifica pentru ca se pomneste deja de la o lista liniard nevid. Evident, valoarea maxrnt nu va filistata, atunci cand se tiparese numerele sortate. Problema se reduce la insertia unui numéf intt-o listé deja sortats. Mai intl se alocé spatiu in HEAP pentru o valoare, apoi aceasta este cit. Se disting doua cazuri: 1. Valoarea citité este mai mica decat prima valoare a listei. Aceasta inseamn cea este cea mai mica din lista gi va fl introdus prima in lista. Gey Fe sta umatoareg se teste 2 + BOLE] al Noua inregistrare va contine adresa nodului 3, iar v confine adresa noil inregistrari: ~ ERE a 2. Valoatea citité nu este cea mal mica din lista. in mod sigur, nu este cea mai mare, pentru o& am introdus Maxtat in lisié. Dacd nu a fost indeplinte conditia de la cazul 1, inseamna o& valoatea nu este nici cea mal mica. Aceasta inseamnai ca ea va trebul introduss in interiorul ist Manual de informatic& pentru clasa a Xia 35 Va trebui s& identifica prima valoare mai mare decét valoarea citi Intruct, odaté gasité adresa acestei valori, avem nevole de adresa precedent (pentru a putea lega fn list& nou nod) vom “merge cu doi pointer, esi e2, unde e1 refine adresa inregistrarli cu valoare mai mare decdt inregistrarea cits, iar & adresa inregistrérii precedente. <2 Fie lista urmatoare gi se citeste 8, Se identific& prima inregistrare care Ex: ‘ejineo valoare mai mare decat cea ct (in exomplu, 9). > — EAGLE] t 4 Noua valoare se insereaza in lista. 2 © Varianta Pascal type Adresa="Nods Pinclude et const MaxInt=32000; ‘ingo:inveger? agr_urn:aaresas aeract Ned ona: Cine intos Noa adevra) var nytiinteser: i var vadrye,ct idsesay ; int mits per et Nod *v, tear, te, ots veeito( n="); Foadin(e main) new) Ceoutintocey->info) 11 peimad ain ihota begin adr’, ady_urmi=v7 { ade->ade_urmevs vesade; veade? end 2» 36. Capitolul 2. Liste liniare Manual de informatic’ pentru clasa a Xa 37 else(nu @ primal din lista) | else ~ i Algoritmul pe care 1) prezentéim tn continuare furnizeaza o singuré solutio begin // nae primal din lista alunci cand problema admite soluti, In caz contrer, specificé faptul c& problema nu crv Cosvs adiite solute. elt=v* .ady_urm while ¢1*,infocade*.info elev-radr_urmy while (cl->infocadr->info) do { e2e-rade_urmy begin el=el-rade_urm; er=0%.adr_urmy ) eli=ol*.ade_urmy e->ade_urmendy; end; adr-padr_urmecl; of -ad_urms ade; > adr’ .adr_urmi=cly d end; //tiparese ond; env {tiparesc) while (c->infot=Maxint) cmv: { cout<infoccandl; while c*.infocoMaxtnt do e=e->adr_uzmy begin y weiteln (ot info); | cree" .adz_urm ond ond. y Jf, Procedout generat unel valori mai mari sau mai mici decat toate cele & _posibile este deseor' folosit in programare. Realizati cat de mult a simpliicat algoritmut? La fiecare adaugare in lista se face 0 parcurgere a acestela, deci algoritmul are complexitatea maxima 0 (n°) 2.2.4.2, Sortarea topologica Presupunem oa dorim sortarea numerelor 1, 2, .... m, numere care se gasesc int-o ordine oarecare, alta decét cea naturala, Pentru a afla relatia in care se gsesc numerele, introduce un numar finit de perechi (4,3). O astfel de pereche ne exprima faptul c, in relatia de ordine considerata, 4 se afla inaintea lul 3. Exemplul 1. Fie n=3 gi citim perechile (3,1) gi (3,2). Numéiul 3 80 alia Eve: inaintea lui i. §1 3 80 até naintea hi 2. Apar Sova’ solutii posibile: 3,12 313,2/2, Intrucat nu avem nici o informaje asupra relatei dine 4 gi 2. De aici tragem concluzia of 0 astfel de problema poate avea mai multe soluti & Exemplul 2. Fie n=3 si citim (1,2), (2,3), (3,2). In acest caz nu ‘XC: avem solufie. Din primele doua relatii rezult& c& ordinea ar fi 1,2,3, iar relatia a-3-a contrazice aceasta ordine. jn concluzie, problema poate avea sau nu solutie, iar dacé are, poate ti unica sau nu Vor exemplifica functionarea algoritmului pentru (3,4), (4,29, (1,2), 3,2). gi citind perechite Pentru fiecare numar Intre 4 gin trebuie s4 avem urmatoarele informati = numarul predecesorilor; lista succesoriior. Pentru aceasta folosim doi vector conter, vector care refine numarul predecesorilor fiecarui Ie, ke {2.- -n}; = a, care retine adresele de inceput ale listelor de succesor ai fiecarui element. Pentru fiecare element existé o lista simplu intanfuita a succesorilor sal Initial, th dreptul fiecérui element din vectoril contor gi a se trece 0. Citirea unei perechi (4,5) Inseamna efectuarea urmatoarelor operatit © Incrementarea variabilel contox (4) (J are un predecesor, $i anume 3); © adaugarea lui § la lista succesorilor lui s Pentru exemplul dat, se procedeaza in felul urmator: owe ToT To] » =e ETS Valorile inifate ale celor dol vectori, am citit (3,4); 13 - adresa listei 3; ome seo] a oe am citit (4,2); Capitolul 2. Liste liniare am citit (4,4); am citit (1,2); am otit (3,1); jin continuare se procedeaza astfe!: = toate elementele care au 0 in cémpul contr se retin intr-un vector ¢; = penttu flecare element al vectorulul e se procedeaza asttel: + se tipdreste; * se marcheaza cu ~1 cémpul su de contor; * pentru toti suecesoriis&i (aflaf tn lista succesoriior) se scade 4 din cémpul contor (este normal, intrucdt acestia au un predecesor mai putin); = se rela algoritmul daca nu este indeplinita una din condijile urmatoare: a) au fost tipétrite toate elementele, caz in care algoritmul se inchele cu succes; ) nu avem nici un element cu 0 in cémpul contox, caz in care relatile au fost incoerente, 39 Tiparese 3, scad 4 din predecesorii lui 4 gi 2, ‘marchez cu =1 contorul luis. Tipdresc 4, scad a din predecesotii lui 2 gi 4, marchez cu ~1 contorul lua, Tiparesc 1, scad 1 din predecesori lui 2, marchez cu ~3 contorul lula. Algoritmul are multe aplicati, ca de exemplu: - ordonarea unor activitati,atunci cand ele sunt conditionate una de alta; + ordonarea unor termeni care se cer explicati, pentru a-i putea explica prin alti deja prezentati Aigoritinul are complexitatea O(n*). Odata sunt n extrageri gi la flecare extragere se parcurge lista succesorilor unui nod. 40 Capitolul 2. Liste liniare Varlanta Pascal Varianta C++ type rof=*inr; inrerecora sucorinteger: urmiret, ond; vootorsarray [1-.100] of integers vactadsarray [1..100} of vee; var n,m, i,j,krinteger; contor, crvector; arvectad; gasit boolean; procedure adaug(i,j:integer) ; var o, atref; begin eontor{3] sreontor 3] +2) ermalily new (4) 5 as .urmesnily ar ouccs=37 if cenit then a[i}:=a else begin while ¢*.umeonil do procedure actual ( var c:ref; Anteger) ; erealily while c end; meny repeat keels gasit:sfalee; for ii=L to n do Af contor{il=0 ‘then begin gasitretrue; arent, otkl rei; raked; contor {41 :=-2 endy | for isi to ket do ‘begin actual (cli) 7 weiteln (cll); end; yatil (not gasit) or (m=0); Lf m0 then writeln('totul @ okt) else writeln(‘rolatit ‘contradictors ona, 2.2.4.3. Operatii cu polinoame ‘n acest paragrat vom prezenta modu! in care se pot programa operatii precum ‘adunarea, scéderea, inmultirea si Impéirrea polinoamelor cu coeficienti reall 88 observam ca, in acest caz, utilizarea listelor liniare simplu inlantuite este necesara gi, exemplul in sine, constituie un argument pentru utiizarea acestora, 2. veces? 8 presupunom c& un polinom va fi memorat cu ajutorul unui vector. Fiecare coeficient va fi memorat de o component a vectorului, De exemplu, polinomul: Loxx+6.00°4390c+2, poate fi memorat cu ajutorul vectorului (20,6,3,2). Dar dac& aver polinomul 3xx%*+1, cum procedam? Este necesar s& avem un vector cu 1457 de componente, dintre care numai prima si ultima sunt diferite de 0, Este ficient s& folosim vectori? Evident, nu. 2 Atunci2 42 Capitolul 2. Liste linare Pentru memorarea unui polinom (prin coeticienti ul) vom utliza o list tniara simpli inlanuié. Fiecare nod al lisei va tine, in aceasta ordine, Goefcientul si gradul unui _monom. Pent simpiicarea operator cu Polinoame, un polinom va fi retinut in ordinea descrescatoare a gradelor. De exemplu, pentru polinomul axx"+ 21°42, vom avea: F ‘Mai jos, prezentam structura unui nod al iste: SE Varianta Pascal “ Varlanta Cre type a as struct Nod sdtRogetody { float coef record int grad; 9a Hod* adr_urmy grad:integer: ites adr_urm:adrtod; ena; 1, Pentru @ adduga un nod liste liniare i r simplu intan{uite, atunct cand aceasta se sreeazé, vom tiiza subprogramul urmator, adaug. Parameti de intrar® sunt sxcesele de Incoput gi de strait ale Het. Desigu, ee putea eva parametul prin iresa de sfarsit a listei, dar, prin transmiterea acestui barametru, adaugarea unui nod ta sfarsitul ste! se poate face cu mult mal roped, peniru cd nu mai este necesara parcurgerea intregil liste. : Varianta'Pascal procedure adaug(var v, e€iadriod; griinteger;cf real); var cradztiods begin new(s) 7 eh gradregr; ch .cosf inet; eh ade urmieni2) Lf vanit then begin viser Bfimcy ena Varianta C++ void adaugiNoars v, Nod*& sf,int gr, float cf) (Nod® ¢7 | ceney Nod) co->grad=or? e->eoef=cf; { sf->adr_umm=c; ste; begin f*.adr_ummise; ef:sc; ena end; Manual de informatic& pentru clasa aXi-a SESE a ‘2. Pentru a crea lista asociat’ unui polinom, vom utliza functia urmatoare, care dupa oe creeazé lista, rotumeaza adresa ei de inceput. Pentru a putea introduce Watele, se cere, de ia inceput, numdrul de "termen (monoame) ai polinomului Este foarte important ca monoamele 88 fie introduse fn ordinea deserescatoare a gradelor, pentru ca functia nu realizeazé ordonarea acestora. Pentru a crea lista se tilizeazd subprogramul prezentat anterior, adaug. Exercifiu. Modificatl funotia astfel incét datele de intrare 88 se g&seascd fntr-un fisier text. De asemenea, se ‘core ca functia s8 sorteze monoamele in ordinea descrescatoare a gradulul. Varlanta Pascal Warlanta a function crePolinom(nr_termeni: | Nod" crePolinom(int nr_terment) Integer) radzttod; | ( var gradul, i:integes cout<<"Date polinom "< ve.grad) 7 views. ade_urm » dreiely end; writein writeln; end; cout<gradsze2->grad) Af c1*.grad=o2*.grad (Af (ci->coet+c2->coef) ‘then adaug(v,8£,cl->grad, begin ‘el->coet+c2->coes) 7 Af c14.coof+ea*.coofe>0 elsci->ade_urmy ‘then e2nc2->adz_urmy adaug(v, sf, 01*.grad, » o1*,coef+62*.coef); | else eliecd*.adz_urm; Lf (cl->grad>e2->grad) e210 .adz_urmy { adeug(v, 9£,c1->gead, nd ‘el=>co0e) else elscl->adr_urm; Af c14.gradre2*.grad + then else begin ( adsug(v, s£,02->graa, adaug(v,s£,c14 grad, e2->coof) 7 cl .cooe cd=02->adr_urmy elizet*.ade_ueny y end af (oD) else while (1) begin { adaug(v, s£,c1->geaa, adaug (v, 8f,02.grad, c1->coes) ; ©2*.coes) 7 el=cl->adr_urm; 102° .ade_urm} > else | Af cleonil while (c2) | ‘then ( adaug(v,8f,c2->graa, | while e1<>nil do €2->c008) begin e2ne2->adr_urny adaug(v, sf, 614.grad, > el* coat) 7 return vi eLtse1* adr_urm; > end else while c2grad, viienily =(7->0008)) 7 while ve> nil do vev->ade_urny begin > adaug (v1, s£1,v4 grad, return vis avi oot); y view’ adr_urmy end; nogativisva; end; 7. inmuttirea unui polinom cu un monon. Pentru a realiza aceasta operatic uilizam functia mulMonom. Functia primeste ca parametri de intrare adresa de inceput a listel care retine un polinom, gradul monomului si coeficientul séu. Functia construieste un nou polinom, cel rezuitat in urma inmultiil polinomului dat cu monomul si returneaza adresa do inoeput a listei care il refine. | Varianta Pascal function mulfonon(v:adxod; Nod" multonon(Hed* v, int or, grrinteger/cf:real) :adzNod float c£) var vi, sf 1adzWod; {Nod vE=0, toy begin while (v) vérenity ( adaug (v#, s£,v->gradtar, vile v<> nil do | ‘y-booot tof): begin veve>ade_ army adaug (vf, sf,v*.gradear, » Ye eoee*ce) 7 return VE views adr_urm: , end multtonom:=v£; ond 8. inmuttirea a dou’ polinoame. Operatia este realizaté de functia mal. Ea are ca parametri de intrare adresele de inceput ale listelor care retin polinomul deinmulit §1 polinomul Inmuititor si returneazé o noua listé In care se gaseste potinomul rezuttat Produsul se objine inmultind, cu fiecare monom al polinomului inmulitor, polinomul deinmuitt si adunarea tiecarui polinom astfel obinut la rezulta. Odservati cum se gterg polinoamele intermediare, care nu mai sunt necesare! 48 49 Capitolut 2. Liste liniare Manual de informatic& pentru clasa a Xi-a Varianta Pascal Varlanta Gre nanuy enctor steerer, oat polemul (imp, factor); Function mui(vi,v2sadetiod) adzxed; | Nog* mul od vi, Nod* v2) i potsemil timp, factor) 7 weerutfactor) yous var v,vman,vaani:adriody (Noa v=0; ; Beorg (factor)? Nod nearne begin white. (2) ' ege=nogativ (pol) + seeTU (DOLD ea) vrenity (Hod tyman=0, ‘ymant sters (pol): Seecgtneey eee while v2enil do ‘ymansmulifonon(vi, rest rmadun (rest, neg) 7 stare (nea): begin va->grad, v2->coeE) stargines) ; 7 ‘vman remultfonon (vl, v24.grad, wnaniev) : ena; > ‘v2 .coet)7 veadun (¥,vman) 7 i end: sterg(vman) ; i (ee vieadun (v, van) 7 sterg(ymant i ; Seat aneteeay iq Pentru a testa subprogramele prezentate, puteti folosi programul urmator, sterg(vmani); i) i : care citeste doud polinoame gi calculeaza suma, diferenta si produsul lor. De a vetumn v; i asemenea, se calculeaza si cétul si restul imparfiri celor doua polinoame. > : i “Varienta Pascal | Varianta C++ struct Nod : (float coets 3. Impartirea polinoamelor. Operatia este realizat de subprogramul divp. Noderecora ee eae Acesta primeste ca parametr! de intrare adresele de inceput ale listelor care retin : coef treal; A ct Ppolinomul deimpartit $i polinomul impaitor. Susprogramul retumeaza adresele de grad:integers Doda daatatpeeuancees inceput ale listelor care retin polinomul cat si polinomul rest, iniial, restul va fl adr_urmsadsNods ae deimpar{itul (se consiruleste lista care retine deimpartitul). Apoi, cat timp gradu! i a eee (int mn; . restulul este mai mare sau egal cu gradul impartitorulul, se aflé monomul cu care see east ost radznoa | cout<<"ltr torment primal Se Inmuifeste cétul pentru a seddea din rest, se calculeaza produsul dine eer polincarts cimom monomul astfe! determinat si cét si se scade polinomul astfel rezultat din rest, { subrogranele prozentate } oat pincropolinen(@); obfingndu-se un nou rest. $i aici, listele continand polinoame care nu mai sunt : ee athe cece prima Set and tueeseschnseas Heer eee i polinom='); readinim); | yoat pawcrePolinom(n)? pliscrePelinom (nm); 1) guna : : : Weite('Nr terneni al doilea Nod* =adun (pt, D2); i : polinom="}; readin(n); | Couecersuna entetgrad,dein->coof); agis(d): iiisw)? pene doinsdein-radr_urn : { produs ) Grice ‘adaug (rest, sfrest, Hy : pis) (D1,p2) + Hoa* cat, *r* Salat oraacasiastenety while (rest->grad>=imp->grad) writeln(‘produsul este‘); aiyptntsgarcat/ iene asereaeine ae { costs rest~>coet/ atis(D) recteatal este" <cinp*.grad do gradulerest-ograd~ atyp tpt eps cat rest) courcerrest ester adaug (cat, ofeat, gradul, coat); mamngdescese, ebaeese? fi else afis(rest); ei # ‘sradul,coot)1 ond. at Capitolul 2. Liste liniare 2.3. Liste liniare alocate dublu fnl&ntuit BAY Deefinitia 2.3. 0 lista alocaté dublu inlaintuit este o structural de date de WARS forma: [Lo [ins [oars [Taos Tits [adr [7 ove Toa] ad dn adr h Avantajul utiizarii listel alocate dublu iniantuit este dat de faptul c& o astfel de lista poate fi parcursé In ambele sensu Operatile pe care le facem cu o lista dublu Infan{uitd sunt urmatoarele: 1) creare; 2) adugare la dreapta; 8) adaugare la stanga; 4) adiugare in interiorul liste; 8) stergere din interiorul liste; 6) stergere la sténga listel; 7) stergere la dreapta listel, 8) listare de la stanga la dreapta; 9) listare de la dreapta la stanga. 2.3.1. Crearea unei liste liniare alocate dublu inlantuit O lista dublu inlanfuité se creeaza cu o singura inregistrare. Pentru a ajunge la numarul de inregistréri dort, utilizim functii de addugare la sténga sau la dreepta. In programul de fafa acest lucru este realizat de functia creaxe. Aceasta funclie realizeaza operatille urmatoare: + cttirea informatie’ numerice; + alocarea de spatiu pentru tnregistrare; © complotarea inregistrarii cu informayia numeric’; ‘+ completarea adreselor de legaturd la sténga gi la dreapta cu 0; Variabilele tip referints b si s vor c&pata valoarea adresei acestel prime inregistrati (b semnific& adresa inregistrarii cea mai din sténga, = adresa ultime! inregistréri din dreapta), : 51 Manual de informatica pentru clasa a Xl-a Cream lista cu un singur element: . Cel eta ¥ 2.3.2, Addugarea unei inregistrari la dreapta Aceasté operate este realizata de funciia adax. Pentru adaugarea unel {nregistrat se realizeazé urmatorii pasi: + citirea informatie! numerice; ‘© alocarea spatiului pentru inregistrare; + completarea adresel a dreapta cu 0; * completarea adresei din sténga cu adresa celei mai din dreapta inregistrari (refinute in variabila 8); ‘+ modificarea campului de adresé la dreapta a inregistrarii din cu adresa noli inregistrér; © ava lua valoarea noil inregistrari, deoarece aceasta va fi cea mal din dreapta. Zeb, Mtuaie ia droop inrogistarea 3. Ss: 2.3.3. Addugarea unei inregistrari la stnga A rcoasta operaie va este propusa oa exerci 2.3.4. Addugarea unei inregistrari in interiorul listei Aceastd operatie este realizata de funcfia Inelud: and Integistrarea cu informatia © parourge lista de la stnga la dreepta cdutan 2 fc Fumeraé m,n dreapta cdreia uimieaza s@ introcucem noua inregistrare; « citeste informatia numeric’; + aloca spatiu pentru noua Inregistrare; Capitolul 2. Liste liniare © completeaza informatia utla; © adresa sténga a noil inregistrari ia valoarea adresei tnregistratll de informatie Utila; * adresa stang& a inregistrarii care urma la acest moment inregistrarii cu informayia numerics m capats valoarea adresei noil nregistrari; * adresa dreapié a noliinregistrari ia valoarea adresei dreapta a inregistrérii cu informatia utild m; + adresa dreapta a ‘inregistrari cu informatia numericdé m ia veloarea noli inregistrar Sx: In lista urmatoare adugam, dupa inregistrarea 3, ‘inregistrarea 5: Propunem ca exercifiu reatizarea unei functfi de adaugare in interiorullistei a unei inregistrai la sténga Inregistréii cu informetia numericd. m. 2.3.5. $tergerea unei inregistrari din interiorul listei Aceasté operatic este realizata de functia stexg. Operatile efectuate de aceasta functie sunt urmatoarele: * Se parcurge lista de la sténga la dreapta pentru a ne pozitiona pe inregistrarea care urmeazéi a fi stears&, + cémpul de adres dreapta al inregistraril care o precede pe aceasta va lua valoarea cémpului de adresa dreapta al inregistrii care va fi sterse; reac Manual de informatic& pentru clasa a Xl 53 © cémpul de adres stanga al Inregistrarit care urmeaza thregistrarii care va fi sterse va lua valoarea cémpului de adres stanga al inregistratli pe care 0 stergem; «90 olibereaza spatiul de memorie rezervat inragistraril care se sterge. jin lista de mai jos se sterge elementul cu informatia numeric& 5: od 2.3.6. Stergerea unei inregistrari la stanga/dreapta listei A wooste souk operatii sunt propuse ca exerci 2.3.7. Listarea de la stanga la dreapta listei Aceast operatie este realizaté de functia tistare care realizeaza urmaitoarele operati: + pomeste din sténga liste; + aldi timp cat nu s-a ajuns la cepatul din dreapta al liste, se tiodreste informatia numerica si se trece la inregistrarea urmatoare. 2.3.8. Listarea de la dreapta la stanga listei FZ oporatia se propune ca exereiiul Capitolul 2. Liste tiniare {In continuare sunt prezentate subprogramele i un exemplu de utilizare a lor: Varianta Pascal type ref=sinr; dnr=recora aires; nrtinteger? ad:zef ends var b,a,crref nymAtinteger; procedure creare(var b,a:ref)) begin weite(*ns"); readin(n): new(b); b*.ner=nz Dsvastenil; b*,adsenily ied ena; procedure addz(var sixef); var diref; begin write('n= new(a) ; @*.nrisay a*.as: @*sadzenity stiadied; eid ond} 2 readin(n); procedure listare(b:ref); var ds while deonil do begin writein(a*.nr)7 disa* sad end end; procedure includ (medntegersb:ref) ; var d,orxef; #include struct Nod (Nod *as, } ant ar? ” Nod *b, #8, 6; int nym, iy aa; void Creare (Nod*é b, Nod*s 5) { cout<<*n="; cin>on} benew Nod) benreny beageb->ad=0; eeb; > void Addr (Noa*s 2) ( coutec*ne") cin>ony Nod* denew Nod; @-pnreny ) void Listare(Nod*@ b) ( Noa® dab; white (a) { cout<nre void Includ(int m, Nod* b) (Nod *d=b, te; while (d->nrlen) ded->ads cout<ony ‘e=new Nod; ->aw=dy Manual de informatic& pentru clasa a Xi-a 55 procedure sterg (m:intege: beret) var diref) begin ib; while a*.nrom do d:= a+ sagt ads=d* ad @s,ad*sagi=d*.a5; aispose (a) ond; + ads begin ‘weiteln(‘Craare lista cu o writela(‘acun listez de la stanga 1a dreapta’); Listare(b); weiteln('Zncludem 1a areapta o inregistrare'): weite(‘Dupa care inzegistrare se face includerea? '); readin(m)? includ (mb) 7 weitoln(‘acun Listes de la atanga la araapta'); Listare(b): weitela(‘Acum stergen o inregistrare din interior‘); weite('ce inreg. stergem? *); veadia(n) storg (mb) 7 weiteln(‘Acun Liste: do 1a stanga 1a Areapta'); Listare(b) main() { cout<<"Creare lista cu o singura inregistr. "<>m) for (islicemit+) Adar(e)s coutcc"Acum liste: do la stanga la dreapta"<>m Enelud (m,b) 7 cout<<"Acum Listez de la stanga 1a dreapta*< + adugarea unul element in stv ae cnevens-ealal iar ioe pronierirartapioniaes : + eliminarea, consultarea sau modificarea ultimului element introdus tn desde agree; (Node eb; i stv, ervadind* sad waile (G-onr len) a-d->a i a adice Secattea treat ‘ Stiva functioneaz& pe principiul L2FO (Last In First Out) - “ultimul end} i intrat primul iesi¢. > { Analizati programul urmator, care creeaz’ o stiva prin utllizarea unei liste liniare simplu inian{uite. Adéugarea unui element in stiva se face cu sudprogramul Puss, iar eliminarea, cu subprogramul Pop. Varful stivel este refinut de variabila v. Capitolul 2. Liste liniare Ei : _ Varianta Cr+ type Adresa=*Hods | Winctude Nod=recora struct Nod inforinteger; ine intoy adz_inap:Adrena; | © Node adz_inap, ena; los var vinaresa; | Noae wy niintegers | sine ay procedure Push(var viadresa; | vold Push (iiod*e v, int n) atintege:)7 {Nod* cy var c+Adzesas if GW) begin { ve new Hod) 12 vent vovinfo=ns ‘then begin vobadz_ing new(w) > veinfoseny o1s0 velar inap:enil; (c= new Nod: ena c->info=ns else begin e-padr_inapevy new(e) 7e*-infoz=n; veer eh vadr. Snap: > vitor > eee yold Pop (oats v) % (Noa er procedure Pop (var v:Adresa); if (lv) var c:Adresa; coutcctstiva este vidaty begin else if venti then Conv: writeln(‘stiva este vida') cout<<"an scos" else begin << e->infoccendls erev vev->adr_inap; weitoln(‘am scos', ¢*-into); delete c7 view’ ade_inapy > dispose (e) > ena main) ena; € Push(v,3); Puoh(v,2)7 begin Push(v,3)7 Push(v,2)) Push (w,2); Pop(v)} Pop(v) + Pop(v); Poptv) Pop(y) Pop(v); PoD(W) i od. y 2.5. Coada implementata ca lista liniara simplu nlanquita capa. Definifia 2.5. O coada este o listé pentru care toate inserdiile sunt facute la unul din capete, iar toate stergerile (consultarle, modificarile) la celalalt Coada functioneaza pe principiul FIFO (First In Fixet Out) - ‘primul intrat primut iesit. Manual de informatica’ pentru clasa a Xl-a 57 Alocarea dinamic& inkinfuita a cozii. © variabilé v va retine adresa elementulul care urmeaza a fi scos (servit). O alta, numita ef, va retine adresa utimului element introdus th coada. Figura urmatoare prezinta 0 coada in care primul element care urmeaza a ti scos are adresa in w, iar ultimul introdus are adresa in sf. _ ef adz_urmsAdrei end; var v,of:adresay niinteger; procedure Pune(var v, ‘sf :Adresa;n: integer) ; var c:Adresa; begin if venil then begin new(e) 1 va sinfor=n; vs ladr_umn! efinvs ond else begin new(e) aff .adr_urm:sc? c*.infor=ny c*sadr_urm:enil; stize end ends wail; procedure Scoate(var v, ef :adresa) 7 var cradresay begin Af venil then writein('coada este vida") aispose(c) ond; Varianta Pascal Varianta C++ type Adresa="Kods #include Nod=recora struct Nod inforintegers {int infos Wod* adx_uxm; void Pune(Hod*e v,Nlod’@ sf, int n) { Rod* cy ‘of->ady_urn=cy o->infons e->adr_urm=0; sfsc7 3 void scoate(nod*e v) { Woa* 7 if (iv) cout<<"coada este vida"<infoccendl; yev-padx_uxny delete ¢7 2 58 Capitolul 2. Liste tiniare { subprogran de stare a @lenentelor aflate in coada ) 11 aibprogian de itetare @ hegin ain () Pne(v, 08/3); runetv,st,2), | susace,ef,4)7 manotv,e Pune (#s88,3)) ulate Puno(e,at/3)) tistasetes Scontatvred)) ‘ulscarcen)? Scoste(e); Ziotare tn Scoate(wiaf)) tistace(yys Secate(v)) idsteretv)s Bcoate(viat); tistaretn); | Secaeeiey, pagearst’)? ona. , Probleme propuse 1. Asociati fiecgrui tip de listé denumit in coloana di t in sténga_desenul Corespunzator din coloana alata in partea dreapié a tabelului urmator, serind cifra asociata fiecarei litere: eo Ep a A. list liniara simpiu tniantuita 1 [> ist4 neliniard simplu intantuts — | 2, Manual de informatica pentru clasa a Xi-a 59 4. Stiind c& adresa de inceput a istel reprezentate in desenul urmator este memoraté in variabila p i cd fiecare nod al listei refine in cdmpul inf numarul serls in desen gi In cdmpul adr_urm adresa elementului urmator, stabilti ce reprezinta expresia de mai jos. = Narlanta Pascal pf -adr_urm*.adr_urm* ne THE} 1a) este 0 expresie incorect’; b) valoarea memoraté in nodul al treilea (valoarea 2); ) adresa elementului al treilea (elementului ce memoreaza valoarea 2); 4) valoarea memorata in nodul al doilea (valoarea 4); ) adresa elementului al doilea (elementului ce memoreaza valoarea 4). p-padr_urm->ady_urm->nr 6. Stiind c& adresa de incoput a listei reprezentate in desenul urmator este ‘memoraté in variabila p $i o flecare nod al listei refine in cmpul in€é numérul scris in desen si in cémpul adx_urm adresa elementului urmator, stabil! ce teprezint& expresia: p*-adr_urm*.nr*.adr_urm p->adr_urn->nr->ade_urm I] oeotson 2. Care dintre noduri liste! urmatoare (identficate prin numere inite 4 si 4) este primul element al listei? 2) nuenista un prim element C. lista liniaré dublu tnlantuita 3a D. lista neliniard dubtu tninquita — | a, TI aya b) 4 ©) 2) 8. Dace 0 lista format din dou noduri (identifcate pri cate prin numerele 4 si 2) are Proprietalea c& slementul urmator noduiul 2 este nodul a si nu existé un element urmator nodului 2, atunci spunem ca lista: 8) este circulara; ») este liniara simplu inlantui ) nueste liniaras; 4) este liniara dublu inisnquits, 2 }—[3 a) este 0 exprosie incorect’ ‘») valoarea memorata in nodul al dollea (valoarea 4); €) adresa elementului al trellea (elementului ce memoreaza valoarea 2); 4) valoarea memorata in nodul al trellea (valoarea 2). 6, Stiind c& exist’ o listé liniard simplu inl&nfulta nevida, fiecare nod retinand tn ‘campul ref adresa slementulul urmator al istel, gi gtiind c& variabilele v gi @ retin adresa primului si respectiv adresa ullimului element al listel, explicafi care este cefectul instructiunil: | Narlanta Pascal” 8’ .refev j~>refsy 7. $tiind ca exista o lista liniard simplu tnléintuités cu cel putin dou’ noduri, flecare od refinand in campul uxm adresa elementului urmator al listei, si stiind c& varlebilele ind si £in retin adresa primulul gi respectiv adresa ultimului element al Iistei, explicati care este efectul instructiunii:

You might also like