Informatica intensiv

338

Click here to load reader

description

Manual pentru clasa a XI-a

Transcript of Informatica intensiv

MINISTERUL EDUCATIEI ~ I CERCETARIIMarianaMllosescuI WnormaleaI IInenslvc++Filierateoretica,profilul real ,specializareamatematica informatica,intensiv informaticaManual penlru clasa a XI-aEDITURA DIDACTICA$1 PEDAGOGICA, R.A.Man ualul a fost apro bat prin Ordinul ministrului Educ atic i si Cercetarii nr. 4742 din21.07.2006, in urma evaluiirii calitative organizmc de catre Consiliul National pentruEvaluarca si Difuzarca Manualelor si esterealizat inconfortni tateellprogramaanaliticaaprobata prin Onli nul rninistr ului Edu catie i Cercctarii nr, 3252 din 13.02.2006.Dcscrier ea elr a Bibli otecii Nati on ale a Rom:ini eiMILOS ESCU, MARIANAInformat ica intcnsiv: manual pentru clasaXl- a IMariana Liliana Mi losescu. - Bucuresri: Edit ura DidacticaPcdagogica, 2006ISBN ( I0) 973 -30- 1567-9; 1513:" ( 13) 978-973-30- 1567-3004(075.35)007(075.35)Lim buj ul C++[UP2006. Toate drepturile asupra acestei edit ii sunt rezervate Edi turii Didactice siPedagogi cc R.A., Bucuresti. Orice preluare, partialf sauintegrala, a textului sau a materialu luigra fic din accasta lucrare se face numa i ellacordul scris al edit uri i ,EDiTURA OIDACTICASI PEOAGOGI CA, R.A.SIr. Spiru Huret. nr. 12. sector1, cod0 10 176, Huc urestiTel.: (02 1) 315 38 20Tel./Fax: (02 1) 312 28 85;(02 1) 3 1573 98E-mai l: edp@b .ast ral.ro. ed pcom@b .astral.roweb : www.edituradp.roComenzile pcntru aceasta lucr are se prlmesc: prin posta , pc adresa editurii, eu mentiunea Comandis carte prin e-mail: [email protected] .ro.comenzi@edit uradp.ro printel. rfax: (02 1) 315 73 98 printel.: (021) 3 15 38 20Referenti: prof gl: I Emma Gabriela Dnrn cscu .Colegiul Tehni c Pet r u Rares, Bucuresti : rnetodist de spe cial itate -Bucu restipro/ g/: I Georgi na Pat rascu.Colegiul Nat ional Sfa nt ul Sava. BucurestiRedactor: Lia na FacaTehnoreductor: i\ l a r iana Desenator: Aurica GeorgescuCoperta: Ele na Dr agul etei Dumit ruNr. de plan: 5 1263; Format 16'70" 100Bun de tillar: august 2006: Coli det!p.lr: 21.Tiparul exec uta: la Iml'riml!ria dl! le.If Oradea1. Tehnici de programare1.1 . Analiza algoritmilorPrin analiza unui algoritm se identifica resursele necesare pentru executareaalgoritmului: timpul de executie~ i memoria.Analizaalgoritmilorestenecesaraatunci candexistamaimulti algoritmi pentrurezolvareaaceleiasiprob leme ~ i trebuiealesaigoritmulcel mai efi cient.Eficientaunui algoritm este evaluateprintimpul necesar pentru executareaalgoritmului.Pentruacompara- dinpunctdevede realeficientei - doi algoritmi carerezolva aceeasiproblema,S8folosesteaceeasi dimensi uneadat elor deintrare - n(acel asi nurnar devalor! pentrudateIe deintrare) .Timpul deoxecutle al algoritmului se exprima prin nurnarul de operatil debazaexecutate i n functiede dimensiuneadat elor deintrare: T(n) .Pentru a compara doi algoritmi din punct de vedere al timpului de executie, trebuie sa se stabi-leasca umtatea de rnasura care se va folosi, adica operati a de baza executata in cadrul algorit-milor, dupa care. S8numara de cateonS8 executao p e r a ~ i a de baza in cazvl fiecarui algoritm.Operatiadebaz a este0operatie eternentara - sau 0succesiune de operatilelement are, a carer executie nu depinde de valoriledatelor de intrare.Exist a algoritmi la caretimpu Jde execut ie depinde de distributiadatel or deintrare. Sacons ider arndoi algoritmi desortareaunui vectorcunelemente- algoritmul desortareprinmetodaselectiei directesi algoritmul desortareprinmetod abulelor - ~ i caoperatiedebazacornparatla. Daca, incazul primului algoritm, timp ul deexecutienudepindededistributia datelor deintrare (modul incaresunt aranjate elementele vectorului inaintedesortarealui) ,el fii ndT(n) = nxIn - J) , i ncazul celui deal doileaalgoritmtimpul deexe-Zcutiedepindededistributiadatelar deintrare(nurnarul deexecutii alestructurii repetitivewhil e depinde demodul incaresunt aranj ateelementel e vecto rul ui in aintedesortare). incazul incare nurnarul deexecutii ale operatiilorelementaredepinde dedistributia datelorde intrare . pentru analiza algoritmului se folosesc :-7 timpul ma ximdeexecut i e- timpul deexecutiepentru cazul cel rnai nefavorabil dedistributiea datelorde intrare; incazul sortarii prinmetoda bulelor, cazul eel mainefavorabi l este atunei cane elementele vectorului . sunt aranjat e i nordine inversadecat aceea cerutade criteriul desortare ;~ timpul mediu de execut ie - media timpiJor de executie pentru fiecare caz dedistnbutie a datelor de intrare.Deoarece, i nanalizaef icientei unui algoritrn, S8urrnarestecomportamentul lui pentru0cimensiunemare adatelor deint rare, pentru a cornpara doi algoritmi din punet devedereal eficientei, estesuficient saS8ia inconsiderarenumai factorul caredeterrninatimpul deexe cutie- ~ i care este denumit ordinul de complexi tate.4 Tehnici de progra ma rcOrdinul de complexitatc al unui algoritm l l reprezinta timpul de executie - esti matprin ordinul de rnarirne al numarului de execut ii ale operatiei de baza: O{{f(n)), undef {n) reprezinta termenul determinant al timpului de executie T{n).De exemplu, daca- pentrualgoritmul de sortare, prin metodaselect iei directe- timpul deexecutie este T{n) ==n21 ordinul de complexitate al algoritmului esteO{n\ deoarecei ncalcularealui seiain considerare numai factorul determinant dintimpul de executie.i n functie de ordi nul de complexitate, exista urrnatoarele tipuri de algoritmi:Ordin de Ti pul algoritmuluicomplexitateO(n) Algoritmliniar.O{nm)Algorit mpolinomial. Daca m=2, algoritmul este patratic , iar dat am=3, alqoritrnul este cubi c.Algoritmexponential.De exemplu: 2, 3 etc. Algoritmul de tip O(n!)O{k") este tot de tip exponential, deoarece:, n- 11x2x3x4x...xn > 2x2x2x...x2 = 2 .O(logn) Alqoritrnloqaritmic.Otnloqn) AlqoritrnIiniar loqarltmic.De exemplu , algoritmul de sortare prin metoda selectiei directe este unalgoritmpatrati c.Ordinul de complexitat e estedeterminat de structur ile repetitive care se executa cu mult i-mea devalori pentrudateledeintrar e. incazulstructurilorrepetitive imbri cate, ordinul decomplexitate este dat de produsul dintre nurnarul de repetitii ale fiecarei structuri repetitive.- -Structurarepetitiva Numarul de executf ale Tipulcorpului structurii algoritmul uifor \ i=l ; iW,W3

121 r 1_. -3 3WAUfast parcursetoate elementelc3 0.!. rnultirnii Apen-tru elementu l Xl al solutiei.Observatie. in metoda backtracki ng, dacas-agasit elementul Xk al solutiei, elementuluiXk+1al solutiei i seatribuie0valoarenumai dacamai exista0 valoarecaresa i ndeplineas-caconditiadecontinuare a construirii solutiei - adicadaca, prin atribuir eaacelei valori , sepoate ajungela0 solutie finala pentru careconditiileinternesunti ndepli nite.Oesenati diagramele pentrugenerarea prinmetoda backtrackinga:a. tuturor aranjamentelor de 2 elementeale rnultimii {1, 2, 3};b. tut uror cornblnariior de 2 elemente ale multimii {1, 2, 3};c. tuturor perrnutarilor rnultirnii {1, 2, 3, 4} care indepl inesc condiiia ca1 nu este vecin cu 3, 2 nu este vecin cu 4.10Tchnici de programarcAlgoritmul metodei backtrackingpoatefi generali zat pentruoric e problemacare i ndepli-neste urrnatoarele cond itii:1. Sotutia problemei poat ef, pusa subforma unui vector S = (Xl . X2 . . . Xn} alecaru ielementeXi apartin - fiecare - unei mut tirni Ai. astfel :X1 EA1,X2EA2, ... XnE An.2. MultimileAi sunt f ini te. iar elementelelor sunt numer eintregi :;;i S8 qasescInt r-oord ine bi nestabi lita.Aigoritmul backtrackingest e urrnato rul :PAS1 . Se alegeprimulelement al solutiei S: X1EA,.PAS2 . Cat t impnu au fost parcursetoate elemen tele mult imi i Al (nu au fost gasite toatesol utiile) ex ec ut a:! PAS3 . Pentrufiecare element al solutiei exec ut a:i PAS4. Sepresupunecas-augasit primelekelementealesolutiei (Xl .X2 . .. Xk)i apartinandrrurltimilor Al .A2, A3, "' , Ak ~ i setrecelacautareacelui deal: k+1-1ea element alsolutiei , Xk+1, printreelementelernultimi i A k+1. Cautareasevafaceastlel : seatribuie. perand. lui Xk+1- elementele multirnii Ak+l .pana seg a s e ~ t e primul element care indeplineste conditia de conlinuare.PASS. Dacaexistaunelement aj i n multi meaAk+' , astfel i ncat Xk+1 = aj saaparnnasoluuei problemei,at unci S8atribui eelementului Xk+1 valoa-reaa, sise trecela Pasul 7: al tfel . se trece la Pasul 6.PAS6. Oeoareces-auparcurstoateelementelemultirnii Ak+l si nus-agasitnici unelement a, care sa lndeplineascacondi tiadecontinuare, S8revinelaelementul Xk ~ i seconsideragenerateprimelek-1elementealesol utiei: X1. Xz, ..., Xk.1 . ~ i pentruelementu l Xk sereiacautareacuur rnato rul element dinrnult imea Ak. adica se reiau operatiile de laPasul 4pentruelementul Xk al sol utiei , tnsanucuprimul element di nrnuttimeaAk ci cueleme ntul dinrnulti rneaAkcarese g a s e ~ t e imediatdupacel carea fast atribuit anterior element ului Xk.PAS7. Se verifica daca s-a gasit soluti a problernei, adica daca s-au gasittoat eeleme ntelernultimi i S. Dacas-agasit soluti aprob lernei,atunciseafi seaza solutia; al tfcl , setrecelacautareaurrnatorului elementalsol utiei , reluandu-se operatii le dela Pasul 4.I..t2. 1mplcmcntu rcametndei backtrackingPentru implementareameto deise folosesc urrnatoarele structuri dedatel;ii subproqrame.Dato ~ i structuri de datePentru a memora elementeleXkale solutiei se foloseste a structure de date de tip stiva . careesteimplernentatastaticprintr-unvector- st. Pentruvarfu! stivei sefolosestevariabilakCands-aqasit elementul Xk al solutiei, seureain stiva, prinincrementareavarfului cu 1(k++), pentru a cautaelementul Xk+1 at solutiei, iar pentru a reveni la elementul Xk-1 al solutieiS8 coboara instivaprindecrementareavarfului cu1 (k--). Initial,stivaaredimensiunea1(kmin=1), corespunzatoare pozitiel de pornire, ~ i continevaloarea primului element al solut.eiPentruelementul dinvarf ulstivei (carecorespundeelementului Xk al solutiel) sevaatribui 0valoare din rnultirnea Ak care poatefi un element al solutiei : st [k] =a [ i] .Dupaparcurgereacornpleta a rnultimilor Ak, stiva va aveadimensiunea n(kmax;;n)corespunzatoare nurnarutuiI II for ma t ira 11deelementealescl utiei . Varful stivei vafi initial 1, lagasireaunei solutij vaavea valoarean,iar la terminarea algor itmului varful stivei va avea val oarea O.Se ma i folose scurrnatoarelevariabilede memorie:-7as - pentru a daca pentru elementul Xk al solufiei mai exista un succesor, adica dacamai exista un element i n multirnea Ak care ar putea fi elementul Xk al solutiei (este a varia-bila logica ce are valoarea 1 - true, daca exista succesor; altfel, are valoarea 0 - false),-7 ev- pentruasti dacasuccesorul gasit respectaco ndl tia decont inuare poatefielementul Xk al solutiei (este 0 variabila logica ce are valoarea 1- true, dacasuccesorul esteelement al solutiei: altfel, are valoarea 0 - false)-7 n - pentru dimensi unea solutiei (nurnarul de elemente ale solutiei, i n cazulproblemelor incare l oate solutiileau acelasi nurnar de elemente).typedef int stiva[ l OOj ;st i va s t ;int n ,k,ev .as ; //k=vArful s ti veiincazul problemelor prezentateinstudiul deC3 Z, unelement Xkal solutiei estel ormatdintr-osinquravatoare: nurnarul dinpozitiak(i ncazul permutarilor, al aranjamentelorsial combinarilor) , respecti v numarul liniei pe care va fi pusa dama din coloana k. i n preble-mele i n care trebuie gas1tuntraseu, un element Xk al sol utiei este format din coua valoricare reprezintacoordonatelepozitiei incare seface urrnatoarea deplasare. inacest caz.pentru memorareaelementelorXk ale solutiei se va fotosi a stiva dubla:t ype def i nt st i ".;a[ lOOj [3];sau0i nregistrare i n care cele doua carnpuri reprezinta eoordonatele deplasarii:struct clenent {in t X/ Yi };typedef e Leme n t st Lva [100J;s t.Lva s t. .Elementelernult imil Ak vor Ii perechi devalori (i ,j) vor reprezenla coordonateleuneipozitii, iar pentruelementul din varful stivei 5 8 va atribui 0 valoare, dinrnultimea Ak, carepoate f un element al solutiei, astl el: st[ k]st( k ] [2 ]=j . respectivs t(k ]. x =i st[k ] . y = j .Pentrusimplificareaimplernentarii, toateaeestedate structur i dedatesunt deelarateglobale. deoareeevaloareapentruvarful stivei 58 vatransmite mai user, int resubpro-grame - ca variabilaglobal a.bprogrameAlgoritmul va Ii implementat prin:-7un subprogram- carevafi acelasi pentru to\i algoritmii de rezol vare prinmetodabacktr acking(parte fi xa) care descrie strategiageneral a backtrackingsi-7subprogramelecareauaceeasi sernni ti cat iepentrutoti algoritmii , dar alcarer conti-nut difera de la0problemala alta, depinzand de condltlileinternealesolutiei.Sernni frcaua subprog ramelor folosi te este (se va considera ea exemplu generareapermut arilor rnulti rnii { 1, 2, 3, ... , n}}:-7Subprogramul ani. t (tunctieprocecurala). Seinitializeazaelementul dinvarful stivei(elementul k). inacest element sevai megi straurmatorul element al solutiei, Acestelement S8initializeaza cu a valoare care nu facepartedinrnultimea Ak considerata,urrnand ca i n urrnatorupasi ai atqcntmutui sa se atribuie acestui element prima12 Tchnici deprogr umarevaloaredin rnultirne aAk. in exemplu, nivelu l kal stivei S8vainitializacuvaloarea0(s t [k] =0). urmandcalapasul urrnator sai seatribuiecavaloare 1. adicii primulnumii r din rnultimea(1. 2. 3 ... n}.void i n i t () } Subproqramul succe s or(functieoperand) . Verificadacarna i exis tainmultirneaAkunelement pent runivelul kal solutiei (un succesor). Dacamai existaunsuccesor, S8trecelaurmatorul element dinrnuttirneaAk. iar functia vareturnavaloarea1(true).Dacii nu mai exist a un succesor. functia va returna valoareaa(false). Valoarearetu rnatadefunctieS8vaatribui variabileias. Initial ,valoareavariabilei dememorieas este1(true) - se presupune ca mai existaunsuccesor. inexemplu, subproqrarnulsuccesorvaverifi cadacapentrupozitiakdinpermutaremai exi stsunnurnar. Dacanurnarul i de pe nivelul k este rnai micdec at n, pozitiei k i S8 vaatribui numaruturrnat or , i+1. functiavareturnavaloarea1 (Irue). iardacanurnarul depenivelul keste n, lnsearrmaca peaceasta pozitiedin permutare numai poatefi pus nici unnurnar - si functi a vareturnavaloarea a (false).i nt succesor ( ){if r s t l k l c n) ( s t [ k ] + -; r e tur n l;)e l se r eturn 0 ; )-7 Subproqrarnu l va L'i d (functieoperand). Ver ificadacavaloareaatribuitaelementuluiXkal solutiei Indeptinesteco ndi tladecont inuare , adicapoat efi considerateeel faceparte dmsolutiaproblemei (dacasuccesorulgasit esteelement al sol utiei). Daca esteIndeplini tacondi tia( S8 evalueaza expresi a princareeste des crisa cond itia), functia vareturna valoarea1(true); altfel , vareturnavaloarea a (false). Valoarearet urnat adefunctie S8 vaatribui variabilei ev . Initial , valoarea variabile i ev este 0(fa lse) - S8presupuneca succesorul gasit nueste elementul kal solutiei , inexemplu, subpro-gramul validvaverifi cadaca numarul di npozitiaknumai exis taincel ek-1pozitiiant erioare. Dacanumarul nu i ndeplineste aceasta conditie, functia vareturna valoareaa(falsa ).int valid ()(for int i f bt[l]=::. .,.,; t [ LJ) return 0 ;return 1 ; }-7 Subprogramul sol u t.r e(Iunctie opera nd). Verifica dacas-auobt inut toateelementelesolutiei . i nexemp lu, subprogramul s olutie vaverificadaceaufost gasitetoat ecerenelementealesoluliei ,adicadacas-augasit solutii dearanjarei npermutarepentrutoat ecerennumere . Dacas-agasit solutia ,subprogramul intoarcevaloa rea1 (t ru e):altfel , intoarcevaloarea0 (falsa).int solutie (){return ):= =:1; }-7 Subprogramultipar (functieprocecurala).Afi seazaelementelesol uti ei, Deobicei ,afi sareasolutiei consta i n afisarea valorilor dinstiva.voidtipar (){for (intcout s L[ i } "c o utendl ;}" .Informati ca 13k=k-1IIXn....X;X2x,Eteme ntele solut i eiParcurgerea elementelor se face cuIsubprogramul s uccesor8i1 a i2 8ij aimk=k+12a21 a22 a2j 82m1a11 a12 a1j atmNumaruldeordi nealele mentelor solut ie;n an1 an 2se cau ta SUCC9sorII c a t t imp are succesor $ i n u s -a gasitI I elementul k a lII{ a s >SUCCGsor () ,.\ 1 2 m/ tNurnarul de ordineal eleme ntelo r din rnultimeaAk Stiva - st [k]Subprogramul valid verificacacaesteelement al solutieiSubprogramul fixpoatefiirnplementat iterativ saurecu rsiv.Impl ement area it erat l vav oid b t() / Jpart.ea f i x a a algorit:mului{kel: lise ri n i.J;: i 2l1i zea zavJr f ulst i ve iinit() ; lise iniJ;:iallzeazd stI va pe rrt r u p.rimu L eleme nt a lsoJ uti eiwhi le (J.-:>O ) Ilea l Li mp s t t va nu s -a g ol i t{a s =l; eve O,while {a s && ! e vii f (a s ) II daca a r ea t un c ieve vaL'i dLj r} 1/ se ve.r i .fi ce oaca este e lement a l ao.Lu ti.e.i.l iseiese d in s tr u c t u r a r e pet ltiva while dace. TIU ma l exis taII s ucces o r sau dac5 s -a gaslt el emer ltul s o1utieiif (a s ) I I dac a a rc s u c cosor, a tunc iif ( s o l u tie() I l daca. s-i eu obt in ut t.oa t.e e.tee.e n cete aoLu r.i .ei ,tipar () ; I I a tunci se af i $eaza e Leme nt. e Le s o lut.dei. ,else { k++; 1/ altfel , se urea in e t t va pentru a. Lnre qi .st r aI I ur-r.a t.orul e lement 01 ao.Iu t i.e i.init() ; } / 1 se ini t,: i al i z e a z a s ti va perl t r uI I ur ma t.o t-u L e Lemen t; 211 s o l utI e -t ,else k- - ; ) I I altfel , s e coboa i-a in s t i va p en t r u a r e v e n iI I 121 e 1eme nt ul an te r ior 0. 1 30111: ] i i .:be 1); )Algoritmul degenerareaprodusuluicartezianpeatef folosit inalteprobl eme. Deexemplu,pentrugenerarea tuturor subrnultirnllcr unei rnultimi .18Tchnici deprogramarcImolementarea rocursivaSubmull imile Sl i va0=00 0 0{3}001{2}o1 a{2,3}a 1 1{1}1 0 0{1,3}1 a 1I{1,2}1 1 a(i,2.3\ 1 1 1osu brnut tirneeste fermatadinelementealernultirnii A. Pentrusimplificareaalgoritmului,vom considerarnultimeaA={1,2,3,....n}. ConsiderarnmultirneaB={0,1}. Pentruconstruireasubmultimilor, pentrufrecaresubrnultirneS8definestefunctiaI:A->B, astlel: dacaelementul i din multimeaAapartinesub-multirnii, atunci l (i)=1; altl el, l (i)=O. Problema se reduce lagenerareaprodusu lui cartezian a'' . Solutiavafi rnemoratai nsuva si va avean elemente , fiecareelement k at solut rei avancvaloarea0 sau1, cu sernnificatia caelementul kdinrnultirneaAapartine, respect iv nuapartine submultirnii. Alaturat, suntprezenlate toate subrnultimile multimii {1,2,3} continutustivei pentru fiecaredintreele.de programulanterior, apar urmatoarelernodificari :-7Deoarecernultirnileprodusului carteziansunt identice(B={O,1}), s-aumodificat: sub-programul ini t () - initial izarea nivelului k at stivei S8face cuvaloarea -1,CU1 maimic decat a-si subprogramul suc cesor () - elementul aresuccesor numai dacaestemai mic decat ultirnul element din multime , 1.-7in subprogramul deafisareasciutiei, vaIi afi sat nurnarul nivelului i pentrucare, i nstiva, se mernoreaz a valoarea1.Imol ementareaiterativa#incl udet ype de f int s:iva[lOO} ;int f:,k,ev,as ;s t Lve s t .v oid Ln tt j)Iint s u c c e so r (){if ( s t [ k ] " ; c Lrc-oi s t [ L] .z=l ; cout c cvy> " ; cin j; st j L] . y:=:j ;f o r (i =1;i; ",' cin i; .':ltfl ] .x=i ; cout-cc vy-. " ; cin j; st r j j . y=j ;bt(); if t I es t ej cout" Nu e x is ta s o.l u t ii " ;)Observatie, Alqoritrnul folosit pentru generarea tuturor traseelor de iesire dintr-un labirint poatefi folosit inorice problema de gasire a unui traseu pe a supratata imparjita inpatratepentrucare exista restrictii de deplasare de la un patrat la altul,------- ".-..... 1. Problema bilei . Unterenestel rnpartit i nmai multezone, fiecarezonaavand0 lnattirneh. Pent rusimplificare, vomconsiderafiecarezona ca fiind un patrat cu aceeasi dimensiune. Terenul poate fireprezentat subformaunei matricecunlinii mcoloane, fiecareelement almatriceireprezentandina1timeaunei zonedeteren. 0 bilaS8gase!?teintr-azonacucoordo-natelex(nurnarul liniei) si y (nurnarul coloanei). Easepoaterostogoli numai catreazonacare are i nfHtimea mai micadecal cea a zonei incare S8 gase!?te. SaS8 generezetoate posibilitatile de rostogolire a bilei - pana la marginea terenului. lndi cat i e. Construi-rea solutiei traseuluiare urrnatoarelecaracteristici: 0soiut ie este fermat a din coordonatele zonelor prin care se rostoqotestebila.7 Fiecaresolutieare un numarvariabil de elemente. Primul element al solutiei continecoordonatelezonei deplecareabilei, iar ultimul elemental solutiei continecoordo-nateleunei zonede la margineaterenului. Bila sepoaterostogoli in8 directii (corespunzatoare celor 8 patrateadiacentepatra-tului i n carese fiecaredirectiede deplasare corespunzandunei canstantededeplasarecareseadauq alacoordonatax, respe ctiv v- apatratul ui i ncarese bila.7 Condi tiadecont inua rea construirii soluliei este capatratul i n careaajuns bilasaaiba lnaltimeamai mica cecat a patratului anterior.2. Problema capcanelor . Unterenestelrnparttt i nmai multezone. Pentrusimplificarevomconsiderafiecarezona ca fiindunpatratcuaceeasi dimensiune. Terenul poatefireprezentat subformauneimatricecunlinii mcoloane, fiecareelement al matrjceireprezentandunpatrat deteren.Anumitepatratecontindiversecapcan eascunse. 0persoana sein patratul cu coordonatele X1 (nurnarul liniei) y, (nurnarulcoloanei) trebuiesaajunqa i npatratul cu coordonatelexz yz deplasandu-seorto-gonal si fara sa calcei n patratele cu capcane. Datele se citesc dintr-un fisier text, astfel:depe primul rand, n, rn si coordonatele patratului depornireal e patratului destinatie,iardepeurmatoarele randuri - perechile de coordonatealepatratetor cu capcan e. Saseqaseasca traseele pecaretrebuie saIeurmeze persoanarespective. lnd icat le.Construirea solutiei traseului are urrnatoarele caracteristici:7 0solutieeste fermata din coordonatele zonelor prin care trece persoana. Fiecaresolutieareun nurnar variabil de element e. Primul element al solutiei continecoordonateIepatratului din care pleaca persoana, iar ultimul element al solutieicontinecoordonatele patratului i n care trebuie sa ajunqa, Persoanasepoatedeplasain4directii (corespunzatoarecelor4patrateaftatepediagonalapatratului incare se qaseste), fiecaredirectiededeplasare corespunzandunei constante de depl asare care se adauqa [a coordonata X, respectiv YI apatratului incare se persoana. Condit iade continuareaconstruirii solutiei estecapatratul in careaajuns per-soana sa nu cantinacapcane.40Tehnici dcprogramarc1.4. Metoda "Divide et Impera"1.4.I. Dcscricrcamctodci .Divide et Impcra"Metodadivideetimperasepaatefolosi pentruprablemelecarepot Ii descompuse insubprobleme similarecuproblema ini\ial;; (care se rezolva prin aceeasi metoda) carepretucreazarnultirni dedatededimensiuni mai rnici, independenteuncl edealtele(carefolosesc multimi dedate dei nt rare disjuncte).[ Sm.dJJiu de caz ISeop: identificarea probleme lor care pot fidescompusei nsubproblemesimil arecarefolo sescrnultimi dedate de intrare disjuncte.Enuntul probl cmei 1: SasecaJculezesumaelemente/o rdintr-unvect or vcafecotuinenumere intregi.Multimea datelordeintrare0 reprezinta cel e nelementeale vectorului v. Ele pot fi divizatei n cate doua submultimi disjuncte, prin divizarea multi mii indicilor i n doua subrnuttimi,Mul\imea iniliala aindicilarestedeterminata deprimul indice (s) deultimul indice (d) , iarintervalul indicilo r careS8 divizeaza este[s,d]. EI se divizeaza indouasubrnult irni disjuncte,[s,m] [m+1 ,d] . unde meste indiceledin miilocullntervalulutm=(s+d)/2. Astlel , problemainitialaestedescornpu saindouasubprob leme,fiecaredintreereconstanci ncalculareasurnei numer elor dintr-o subrnultimede elernente (carecorespunde unui subinterval alindicilor). Descompunere a continua pana cane fiecare subrnultime cont ine un singurelement - se poate calcula suma, obtinandu-se solutia subproblemei .Enuntut probl emei 2: Sase cetcotoze suma1x2+2 x3+ ... +nx(n+1).Multirnea datelor deintrareareprezi ntaprimelennumer enaturale. inifialaestedetermmatadeprimul numar (s=1) deultirnul nurnar (d=n), iar intervalul caresedivi-zeazaeste[s,d] . EI sedivizeazai ndouasubmultimi di sjunct e, [s ,m] [m+1 ,d] , undemeste nurnarul dinmijlacul intervalului: m=(s+d)/2. Astle l, problemainitiala esledescornpusai ndoua subprobleme, fiecare dintre eleconstand in calcularea sumei produselor dintredouanumereconsecutivedintr-o subrnultime de elemente(care corespundeunui subinter-val al numerelor). Descompunerea continua pana cand fiecare subrnuttime contine unsingur element - sepoatecalcula produsul , carese vaadauqa lasurna, pentru a obtinesolutia subproblemei.Enuntulprobl emei 3: Sa 58 genereze termenuf n al suului luiFib onacci.Sirul lui Fibonacci estedefinit recursiv: 1,=1, 12=1 In=In-2+In.1, pent run;,3. Problemadeterminarii termenului nal sirului lui Fibonacci sepoatedescompu neTn doua subpro-bleme : determinareatermenului n-1si determinareatermenului n-2. Descompu- *.nereacontinuapanacandtrebuie deterrninati termenii f1 si Iz. a carervaloare cunoscuta.Metoda Divide et impera sebazeaz a pedescompunerea unciprobleme i nsubprobleme sirnilare, prinintennediul unui pr ocesrecursiv. Procesul recursi v dedescompunerea unei subprobl eme i n alte subproblcme co ntinuapana se obtineo subprobl ema curezol varea irnediata (caz ul de baza), dupa care secom punsolutiile subprobl emel or pana so obtine solutia pro blemoi initi ale.III Iorill ati ciI 41Pasii algoritmuluisunt :PAS1 . Sedes compuneproblema insubproblemesimilareproblemei initiale,dedirnen-siuni mai rnici, independenteunele dealtere(care folosese multimi dedate deintraredisjuncts - d.).. PAS2. Dac asubproblemapermite rezolvarea irnediata(corespunde cazului debaza),atunci S8rezolvaobt inandu-sesolutias: altfe l , S8 revineIaPas 1.PAS3 . Se cornbinasolutiilesubproblemelor incarea fost descornpusa(5,)0subproble-rna, panacandS8 obtinesolutiaprobleme i initiate.1.4.2. Implementarca metodei Divide et lmperaDeoarecesubproblernele i n careS8 descompuneproblemasunt sirnilarecuproblemainiti-ala , algor itmul divi deet imper a poatefi implementat recursiv. Subprogramul recu rsivdivide_et_im pera( d,s), unde d reprezinta dimensiuneasubproblemei (cores punde multirniidatelor de intrare), iar5 soluti a subproblemei, poate fi descris inpseudocodastfel:divide_et_impera(d, s)i nc e p u tdaca d i.me ns iunea drco r capuridc UfL.:.i.C:l Z d e t. a aaatunci s e S aaltfelpentru i=l , r. execu tac e det e r m.ina d imens i unec d i a s uopzob Leme L p.;...i ; s oLut i. ai:l aubpr-obLeruc ip.ri.nape Lu I(d_ i , s _ i) ;s t ar s i. s e c omb i na s o Lu tLj. Le 5_ 1 , 5_2, 5_3 , . . , 3_ n;s f ar-s i. t;Imptomentaroaacestui algoritm in limbajul C++se face astf el:/ 7dcclarar;-.ij c;lobaJe pent r u dat e Ie de i nt r a r evcc vor- fj d ivi ze t.e vi n sub-mu . Lt.dm.i oisj un c t e pent r u ts ubprobLemcLe Incare se descornpune prcbl cme v Zvo iddi vizeaza {cp e r-ame t.r-L : s ubmul t.i.m.i Le> -s.{// .s>2 d1.\r1::ea7.0 mul timca eke' date de dn t ra re i n sucmuLtimi di s jpncte d_ i} solutllle 5_1 care s e comblna? ){ '/38comb ina cbt .inut;e S_l.}void dei pa r a me t r i : multimea de date d $i 501uti a s> l de vari abi lei f (c os te ca z de be za> {,lI s e obt i ne so lut.La cor.espunaaroare eubprob.lcmei Ie lse{d ivizeaza parametri: k submultimi ;for ( 1. =1 ; .i e-k: i-II)dei parametri: multimea d e date d_i $i s olutia s_i;combina parametri : soluti i 1e s_i>l ;} }voi d mai n()( jl de c l a r a t i i de variabil c lQcsle/Isco c i t c s c dat.cLc d e i.nt r e re ale pr-ob l eme i. - mul timea ddei pa r ame t r i : multimea de date d $i soluti a s ;lise a f.i$ea::5 s ol ut i.e p robl eme i - s}42Tchnici deprogramarcExemplul 1. Sa5 8 calculezesumaclementelor pare dintr-unvector v care continenurne-re intregi. Nurnarul de elemente ale vectorului (n) elementele lui se citesc de la tastatura.s=1 1 2 3 4 5 d=55 10 1 15 I 20 25m- (1+5)/2-3z=z12345= z123+ z45=10+20=30./ n : d e i ( n, z ) ; couuc c z r }i n acest exemplu, problema a l ost descornpusainprobl emecare nuAtcntie sunt independente unele de allelei n apelu rile recursive,aceeasi subproblernaesterezolvatade mai multeori : 1(4), 1(3), 1(2),1(1). Pentru acest tipdeprobl ema nu serecomandii metoda divideet imperadeoarecenueste eficlentaInformaticii45Exemplul 4: SaS8 determi ne simultan valoarea minima9i valoarea maximadintr -unvectorvcarecontinenume reintregi . Nurnarul deelemente alevectorului (n) elementel elui se citescdela tastatura.l mplementarea metodei di vi de et i mpera i n acest exempluS8 faceastfe l: Subprogramul divizeaza ()- Nurnarul de subproblemeincare S8descompunepro-blema este 2(k=2). Divizarearnultimii datelordeintrare seface lafel calaexemplulpentru calculareasumei elementelor unui vector ;;i subprogramelesunt identice.-7 Subprogramul combina ( )- Combinareasolutiei l nsearnnadeterminareaminimului [ zL)a maximulu i (zz} dintrecele doua valori minime(x l y l ), respectivmaxime(x2si y2 ),obtinute prin rezolvareacelor doua subprobleme. in subproqramsunt combinateceledoua perechi de valor i obtinute din cele doua intervale . Dacax1>y1, atunci minimu l (z r.)este y L, altfel , este x l.Daca x2>y 2, at unci maximu J(z 2) este x 2; altfel, este y 2.-7Subprogramul dei ()- 0 subproblems corespunde cazului de baza atunci candsubrnult irneacont ineunsingur element (sepot calculaminimul maximul; atat minimulcat maximul vor avea valoareaelementului) . Dacas-a terminatprocesul recursiv (prinprocesul dedivizare celedoua capeteale intervalului auajunssa fie identice) , atunciseprelucreaza cazul debaza (secalculeazaminimul maximul InvariabileJe z l si z 2corespunzatoaresolut iel): altfel , seapeleazasubproqrarnul pentrudivizareainterva-lului,se apeleazasubproqrarnul d e i () pentruprimul interval, seapeleazasubpro-gramuJdei () pentrual doi leainterval si secornbinaceledouarezu ltate.#i n clu d e i n t v [lOO ] , novoid d i v i ceaa c{i n t s ( i n t d , int &m) { rn> (s Id ) 12 ; }v o id c ombi n a( i n t xl , i rit yl , i n t &z l ,int x2,i n t y2 , i n t &z 2){i f (x l >yl ) z1c:;yl ; el s e z l =x l ;if (x2>y2) z2;::x2 ; el s e z2 =y2 ; }voi d dei Ci nt s, i nt d , i n t &z 1, int &z 2 ) II z 1 - mi nim, z2 - maxi m{int m,xl ,x2,y1 ,y2;i f (d-:: ::.s) z Le.z Zv-vl.sl :e lse {d.i.vLae aze ts , a ,m);Ilxl - mini m, x2 - max imd ei(ml-l , d , y l , y 2 ); Ilyl - mini m, y 2ma ximc ombina (x l , y l , z l , x 2 , y 2 , z 2 ) ; } }voidma i n C){int c ou t. x-cvne "; c i n n;f o r ( i;:: l;iy ) r eturn X; e lse r e t u r n y; }iotx,i o t y ) {if (x >y) r e turo y; el s e r e t u r n x; }voiddivize a za{i n td , i nt &mi j l ) {mi j l = ( s +d } / 2 ; }voi d dei ( i nt s, i nt d){int mi j l ;i f (d , =s)i f (d: 1 a[O][OI Ia[0][ 1] 1 z octeu a[3][0] Ia[ 3][11 I f . ',.fadr adr+2 a[ 1][0] I a[1][1] a12][0] I a[2][ 1]I d +12 adr+14t .... aradr+4 adr+6 coloana 0 coloana 1adreste0 adresade memorie care are valoarea constantei simboliceaAlocareamemoriei unei matrice sefaceInmodcontiguu , memor areaelemente lor facan-du-se linie cu linie,astfel Incat matr iceaapareca un vectordelinii. Dacamatr iceaare mliniisi n coloane, ea va avea mxn elemente.De exemp lu, matricea a are 4x2=8elemente ;;i esternernorata ca un vectoreu melementede tipvectorcunelemente, careau tipul de bazaalmatricei (in exemplu, un vector cu 4elementede tip vector cu2 de elemente de tip int). Zona94Implementareast ru ct ur ilor dedaledememoriealocataunei matricearedimensiuneamx n xstzeofttipbaza). in exemplu,rnatricei a j se aloca0zona de memorie de 4x2xsizeof( i nt) =4x2>< 2=16 octeti. Identificarea unuielement al rnatriceise facefolosinddoi indici (i j ). Adresatabloului este adresaprirnuluielement, a[O][O] . Daca adresa tabloului este adr, adresa elementului este:adr + i xnxsi zeof(ti p_baza) + j xsi zeof(lip_baza)= adr + (i xn+j) xsizeof(ti p_baza) ,Pentru exemplul demai sus, adresa elementului a[3] [1] este:adr + 3x2xsizeof(int) + 1xsizeof(int) = adr + 3x2 x2 + 1x2 = adr +14.2.2.3. Opera tori pcntru variabile de tip pointerPe variabilelede tip point er se pot aplica urmii toarele tipuri de operatori: oper at ori speci fic i , operatorul deat ribuire,-7 operat ori ar it met ici ,-7 operatori relational l .2.2.3.1. Operatori i specificiOperatorii specifici variabilelor de trp pointersunt:-7 Operatorul&- operatorul dead resare .Seaplicape0 vanabiladememoriesauunelement detablou dememoriel?i furnizeaza adresa variabilei dememorie, respectivaelementului detablou. Rezultatul obtinut prinaplicareaacestui operator estedetippointer. Operatiasenurnestereferenti er eaunci variabile dememorie. Operat orul*- operatorul deredi rect ar e. Seapnea pe 0 variabiladetippointerfurnizeazavaloarea var iabil ei de memoriecare selaadr esa rnemoratai npointer. Rezultatul obtinut prinaplicareaacestui opera tor estedetipul date i asocia tepointerul ui. Operatia se nurnestedoret orentierea unui poi nter.&- operatorul de adre sareIrcf crent i erea...nume variabila devariabi lei de memorieadresa variabiladememorie memorie(continut) (pointer)'* - operatorul de redi rectaredereterennereapointerului Observatii :1. Pointerii reprezinta adresealeunei zonedememorie (continutul unei variabiledeme-moriep detippointer este0 adresa de memori e).2. Acce sul la0 zonadememoriesepoatefacefiefolosindidentificatorul asociat zoneidememorie(numele var iabilei dememorie),fieaplicandoperatorul de redirectare peadre sazonei dememorie(continutul adresei dememorieindicatedeunpointer psereferaculo p).3. Dimens iuneasi sernnific ati a continutului unei zone dememorieindicatedeunpointerdepind detipul pointerului.Exemplul1int a =1 0, *p =&a ;cou t p e nd l a e ndl ;coutpendl \ u e ndl;Informatica95S-adefinit 0 variabilade memoriedetipint (a) 0 variabiladetippointer catretipulint (*p) carei ai s-aatribuit cavaloareadresavariabilei a. in memoriainternasevor alocadoua zone de memorie: una de 2 octeti,pentru variabila de memorieidentificataprin numelea, incareS8 pastreaza a valoarenumerica l ntreaqa, una de 2 octeti pentru variabilapointeridentificataprinnumelep, incareS8pastreaza0 adresadememorie(i nexemplu,adresavari abilei de memoria a). Continutul Beeslor zonede memoria astaprezentat infigura.I I2 octe\i 2Geteti4t adC= --- :1100Memoriainternab i 58 atribuie valoarea de laadresaudi ca ve Lce ree v ar i.abi.Le i. a -Joe !Ilafi$ea za 10 10I Joevariabilei a c a r ei a dresa este memorata in(adica , variabilei a ) i va10area 1 00 */u b i:00 10Ptininstructiuneacout-oc- p i seafiseaza continutul variabilei dememoriea. Referirealaaceasta variabila dememorieS8facenu prin numele variabilei, ci prin operatorul de redirec-tare'/< aplicat pe variabila pointer p in care este rnernorata adresa variabilei a. Aceasta instruc-tiune areacelasi efectca instructiuneacout -oc a , . Prin instructiuneaccut-ocp, se afisea-Z30 constantshexazecirnala care reprezinta0 adresa dememorie (adresaadrla care estememorata variabila a). Aceasta instructiune are acelasi efect ca si instructiunea cout &ai.Exemplul 2intb= *P i I +va riabileimemorat a invariabila p ,cou txca-cc ' u b i*p=l OOipoint. e rul pcout a "Observatie Dacatipul dedata indicat depointer estetipul i nregistrare, dataconunemaimulte carnpuri . Operat orul dered ircctare princarese furni zeaza co ntinutulunui campesteoperatorul ->si senumeste operatorul de selectie indiracta amcmbrului uncistructun44/ / a fi$eaza 3/I a::i.'?eaza 3 - > EI coniine doua refer inte: una lacontinutul adresei indicatede pointer si altacatre unmembru al l nreqi strarii (carnput). Rezultatul furnizat deexpresieestevaloarearnembruluiselectat (acarnpu lui). Esteunop eratorbi narcareareprioritatemaximaasociat ivi-tateadela stanqala dreapta.Exemplustr uctt i n t X ,Yi } ipunctcou t a . x" " a . y endl ;cou t-oc p - c-x-c-c" " P - >-f ;Observati i1. Operatorul * se poatefolosi inambiimembri ai unei operatii de atribuire:,nt II ( 1)*q= *p; I I (2)96 huplcmcntarcu strncturilor de datede 12 adres a in va ri abil a q ,va r i a b i-lei b , i se atribuie va Loa r ee de La acir e s a memo r a t a 1.:1vari abila p , adlca valoarca acc ucc c acc'' " 0 ; //a:i:;;eaza 10 10I IP "p adr_3p a *p adr_3 :*q=*p Iq b adr bq ->Memoriainterna(1)vMemoriai ntorna(2)2. Constructiarp (p fiindunpointercatre un tip dedata) poate apareai n orice expresie inlocul unei variabile de memorie care are acelasi tip ca si eel asociat pointerului :int a ""lO, *p=&a;*r-'= *p +S; /+ Lnc remencea z a cu 5 ve Loe r ee var i abi.Le i. de 1a aci r e aa P,valoarea var i 0bilei a*/cour.c-ca-c-c' ' " *( i + a ) H i [ a]Un element al mat ricei a poate II identilicat, folosind cei doi indici i :,i j , prin a[i][j] .Asociativitateaoperaton..Iuiindiceal t ab l oul ui fiinddelast anqaladreapta prior itateasa fiind cea mai mare, calcularea adresei elementului se va face asttel : mai Inta i seexecuta suma dint re pointerul a si constanta i si apoi suma dintre rezultatul obt inutanterior si constantaj . Prin aplicareaopera toril or indi ceal tablo ul ui se obtineadresaelementului dinlinia i coloana j , urrnatoarele expresi i fiindechivalente:a l i ] [j] (*(a+i)) [ j] *(&a [ O] [ O] +n * i + j )2.2,3.4. Operatorii relationaliOperatorii relationalicarepot fi aplicaf asupra pointerilorsunt:-7 Operatorii dei negali t ate : , =7 Operatorii de egal ita te == :,i !=.Evaluareaunui operator relational aplicat pedoi pointeri p;;i q seface prinanal izadife-rentei p-q.102 lmplemcntareu st r uct uri lor de dat eExemplu- Seafiseazaordineaincareapardouavalori x yl ntr-un vectorcunumereintregi. Sefolosesc doi pointeri psi qcatreelementelevectorului. Separcurgevectorulfolosind pointerul ppentru localizareavalorii xsi pointerul q pentrulocalizarea valorii y.Stabilirea ordini i de aparitie in vectorS8face prin compar area celor doi pointeri (a adreselormemorate inpointeri).int x ,y, a[lOO], *p=a , *q =a ;c out " n= " ; c Lroc-n :f or ( ; p " ; cin *p ; }cout"p r i ma va l oar e= "; c i n x ;cccccc? a doua va .J.oa r e= " ; c i n y;p =a ;while (*p! =x ) pit ;while ( *q !=y) q++ ;if (p>q) cout-ccvva l car e e ", , , ;21 >, , , ;Informati cii 117; < t . i p ~ m > , < i n f o_m2>,nod " urmr L :nod *prim, *ult i m, *p;Carnpurile< i n f o_ i j>sunt carnpurilecu inforrnat ii, iar carnpul urmesteuncampde tippointer catretipul debazanod ~ i cont ineintorrnatia deleqatu ra(adresaurrnatorutui noddin lista). Aeest tipdei nregistrar esenurneste inregistrareaauto referi t a.S-audeclaratvariabilele de tipadresaa unei i nreqistrari de tip nod:-7*prim ~ i *ul t i m pent rua memoraadresaprimului nod, respectiva ultirnului nod;ele va ajutasa ldentificati extrernitatile listei;-7 * ppentruamemoraadresaunui nodcurent di nlista(estefolosit pentruparcurgerealistei).in lisle, algoritmii de inserare si eliminarea unor noduri din structura S8 sirnplifi ca foarte mult7 Inserareaunui nodconstainalocareazonei dememorie i ncareS8scrienodul silegarea lui la structure(stabilirea legaturii eu predeeesorul si eu sueeesorui lui).?' Eli mi nareaunui nodconst ainrupereanodului dinstructur e, prinlegareapredece-sorului saucusuc cesorul lui, ;;i eliberarea zone!de memoriepecarea ocupat-o.!."." ."Liste generale Uste restrictiveNu exlsta restnctii pentru operatiile de Exista restrictii pentru operatiile demserare $i sterqere a elementelor din lista inserare $i sterqere a elementelar din lista(se pot face in ortce pczitie a listei), (se pot face numal la extrernitati).I....Stiva CoadaOperatiile de introducere si extragere Operatia de introducere a elementelor sea elementelor se pot face numai face pe la 0 extremitate, tar extragereaprintr-una dintre extrernltati. elementelor - prin cealalta extremitate... .. ..Usta simplu Inlantuita Listadublu inlantulta UstacircularaFiecare element pastreaza Fiecare element pastreaaa Este 0flsta inlantuita inlegatura cu un singur vecin legatura cu ambii vecini care elementul ult im se(de obicei. succesorul). (succesorul $i predecesorul). leaga de elementul prim.2.6.2. Clasificarca listclor'--:L-;- i s-: t e-:7 1in-: i a-r- e- IAlgori tmii cesepot f ol os i po nt ruprelu crarea Ii stelor:-7 initi ali zarea Ii st ci - secreeazalista vi da;7 crca reali st ei - se adauqarepetat elementela lista, porn ind dela list a vi da;-7 i nserarea unui clement i nli sta - la i nceput, la sfarsit , ininte rior;-7 ste rqe reaunuic lement di nl ista - la inceput, lastarsit , i ninterior;-7 pa rc urgereal i st ei - seviziteazaelementeletistei pentrua obtineinforrnatii:-7 cautarc a inlistaa unuicl ementcarelndepline steanumiteconditii:-7sortare a unei liste;-7 concate narc a a doua liste;-7 divi zar caindoualiste .118Impl cmcn tarcast r uct uri l or de date2.6.3. Agoritmi pcntnt prcillcrarca listclor simplll inlantllitcListasimplu inlanluitaIN U L L ~ infoultimI urmI lI rm-1r.::: info"--_---''-----JI~ I II. . furm I In0infoprimIn Implementarea alqoritrnilor urrnatori S8 considers ca inforrnatia propiu-zisa estefermatanurnai dintr-un camp i n car e S8 rnernoreazaun nurnar i ntreg: 's truct nod{int info ; /linfor ma1;. ia p r c p r Lu-e z l s anod *u r m;}; l/inf orma1;;ia pent r u Leqe t u r anod *pr i rn, *u l t i m, ~ p ; j/pointe ri pen tru e xp loa t a r e a l i s teiint x; . / /pent ruvaloarea ce s e atriliuie cempuIui, eli I n format.L'ii nlista vidaatat nodul prim cat ~ i nodul ult imnu exista, ~ i adresa lor are valoareaNULL:prim = ult im ",. NULL; Stareade ll sta vi da trebuie cunoscuta atune! cand S8elirninanoduri dinlista, deoarece in(isl a vidanu mai existanoduricaresafie eliminate.AceastastareS8testeazaprin conditia : pr im = = NULL. Pentrutestarea unei listedacaeste vidase poateimplementa functi a operand este_ v i d a( ) careva furni za valoarea1("adevarat"), daca lista estevida, ~ i valoarea 0 (.t als") daca Iista nu este vida.i nt e s cejvLd e( nod " p r i m){return p rim==NULLil2,6.3.1. lnitializarealisteiPrin acest algoritm se creeazalista vida. i n acestcaz, atat nodul pr imcat ~ i nodul ultimnu exista, ~ i Ii se atribuie adresaNULL.Implementareaalgorit mului. Sefolosestefunctiaproceduralai n it () ai carei parametriprim~ i ul tim de tip nodse transmit prin referinta. deoarece sunt pararnetri de iesire.v oid i n i t (nod * &p r i m, n od *&u l t i m){p r i m= ul t im=NULLi l2,6.3.2. CrearealisteiDeoarece i n alqoritrnii deprelucrare trebuie sa se cunoasca adresaprirnului nod, este impor-tanta adauqarea primului nodla lista vida. Pasii algoritmului de crcare a unei liste sunt:PAS1. Se adauqaprimul nod la lista (nodul pri m).PAS2. Cat t imp mai existainformatie, exec uta: se adauqaun nod la lista.2.6.3.3. Adauqaraaprimului nodlalistai n Iista cuunsingurnod, adresa delegaturaa nodului pri marevaloareaNULL - ~ i atatnodul pr imcatsi nodul ul timau aceeasi adresa. Pasii executati i n acest algoritm sunt:PAS1. Se cere alocareade memorie pentru nodul p r im.PAS2. Se scrie inforrnatia innodul pri m.PAS3. Adresei de leqatura a nodului prim i se atribuie valoarea NULL.PAS4. Nodului ul tim i se atribuie adresa nodului p r im.Impl ementarea algoritmului.Se foloseste Iunctia procedurala adauga_nod Oai carei para-metri prim~ iul t i mde tip nod se transmit prin referinta, deoarece sunt parametri de iesire.voidada ug_nod ( nod * &p r i m, nod *&u l t i m){p r i m= new nod i p r i m- >info=x i pr im- >urm=NULL i ultim=p rim;}Informatica1192.6.3.4. AdauqareaunuinodlalistaPentruadauqa reaunui nodplalista, infunctiedecerinte leproblemei, S8 poatefolosiunul di ntrealgoritmii urrnatori :1. adauqaraa infata pr imul ui nod ;2. adauqarea dupa ultimul nod ;3. adauqaroa l nt r-o poziti e ininter i oru l li stei.Adauqare intalaprimului nodPasii executati inacest algoritmsunt:PAS1. Se cerealoeareade memoriepentru nodul p.PAS2. Se serie inforrnatia innodu! p.PAS3. Nodul pse leaqade nodul prim.PAS4. Nodul pinserat devinenodul prim.I Adauqare in fata pri mului nodprim1 i nf o p ij i nfo @rnJultlrnG;3--+info pdevinenodul prim]Impl ementareaalgor itmului . Sefolosestefunctia procedurala adaugayrimOalcareipara-metru prim de tip nod S8transmite prin reterinta,deoarece este parametru de intrare-iesre.voidadau ga...J'Jritn(nod *&p r i m){nod nod ; p ->i nfo=x ; p->urm=p r im;Adauqare dupa ultimul nodPasii executati inacest algoritrnsunt:PAS1. Se cerealoeareadememoriepentrunodul p.PAS2< Se serie intorrnatiainnodul p.PAS3. Nodul pestenod terminal (nu se leaga de nimie - adresa de legatura este NULL) .PAS4. Nodul ul timse leaqade nodul p adaupat.PASS. Nodul padaugat devinenodul ul tim.I Adauqarea dupa ultimul nodp riminfop devinenodul ultimultim ....... ...... ................ .............,p ..inf o Implemen tarea algoritmului. Se foloseste functia procedurala adauga_ultim() al carei para-metru ul tim de tip nod se transmiteprin referinta, deoarece este parametrude intrare- iesre.void a da uga...;.. ult im( nod *&u l t i rn }{nod *p=ne wnod i p->info=x ;ul tim=p ; }120 Implemcnta rea struct ur ilur de dat eAdauga rea i n interi orul li st ci S8 poate face indouamodur i:a. dupa nodul cu adresaq;b. in aintedenodul cu adresaq.Ad augarea i ni nterioru l l i st ei dupa nodul cu adrcsaqPasii ai qoritrnulul sunt:PAS1. Se cerealocarea dememoriepentrunodul p.PAS2 . Se seneinforrnat ia innodul p .PAS3 . Nodul pse leaqa desuccesorulnodului q .PAS4. Nodul q se leaqadenodul padauqat.PASS. Dacanodul qa fast ultimul nod, nodul padauqatdevine nodul ul tim.Adauqare dupii nodul qINULL,Iqprim q->urm ulti mI! , nl o I urmfI'.. j, Jl . I I J I"" ' - ' n- I o-,..-----,I, , L ur.. In0 urm Ip ..miinfolm"trj:".JImpl emcntarca algoritmului. Se foloseste functia procedurala adauga_dupa () ai carei para-metri sunt de tip nod: q (adresa nodului dupa care se face adauqarea), care se transmite prinvaloare , deoarece este parametrude intrare,!ii i ul tim (adresa ultirnului nod), care S8 transmitsprinreferinta, deoarece este parametrude intrare-iesire.void adauga. du pa( nod *q , r:.od *&ul t i m){ nod "p vnew nod;p-csi.n f o e x : p -c-urmeq -c-u r m: q-c- u rur-p , i f (q==ul tim) u l.f Ltr r-p r )Adaugarca ininteriorul Iistei inaintede nodul de adresaqPentruaadauqanodul pl nainteanodului q,trebuiesaleqarnpredecesorul nodului qdenodu! p. Dar, predecesorul unuinod nu este cunoscut. Adauqareaunui nod inlista inseam-na, defapt , inserareai nlistaainformatieipecare0 contine, i ntrealtedouainformatii, !?ianume: informatia dinpredecesorul nodului qtrebuiesafie anterioaraei , iar informatia dinINULLIIAdaugare inaintca nodului qq q- xurm ultim___--'-_u_rm_ ++_ v .,,2....., .. --,-_u_rm_ff_v_3_ ..l I_u_r_mff==V=4=======(1)primI' v1I NULUI...v2 I urm f p II(2)primIn furmatica121nodul qtrebuie sa a urmeze. Ast fel , inlista nu se vaadauqanodul p i nainte denodul q, cidupa el, interschi rnband apoiinformatiile lnt recele douanoduri. Pasii algoritmului sunt:PAS1 . Se cer e alocareadememorie pent ru nodul p.PAS2 . Se cop iazainformaliadinnodul q innodulp.PAS3. Se sene I n nodul qinforrnatia caretrebuieadauqatala115t3.PAS4. Nodul pse leaqa desuccesor ul nodului q.PASS. Nodul q seleaqa denodul padauqat.PAS6 . Daca nodul q a fast ultimul nod, nodul padauqat devine nodul u l ti m.Implementarcaalgoritmului. Sefoloseste functiaproceduralaa d a u g a_ in_ f a t a() ai careiparametri suntde tip nod:q (adresanodului inaintea caruiaS8 faceadauqarea), care S8 trans-mite prin valoare, deoarece esteparametru de intrare,:;;i u l tim(adresaultimului nod) , care S8transrni te prin referinta,deoarece esteparametru de intrare-iesire.void oda uga i n fa t a( nod *q, nod *&ul t i m){nod q->inf o=x ; q- >urm=p ; uLt.Lmvp r }2.6.3.5. ParcurgerealisteiPrinacest algoritmseviziteazafiecarenodal listei , pornind delaprimul nod , panalaultirnul nod , in ordinea delnlantuire anodurilor - furnizata deadresa urmdinnodulvizitat. l.istase parcurgepentrua prelucrainformatiastocata Innoduri .Implementarea algor itmului. Se foloseste functia procedurala parcurge () al carei parametruprimde tip nod se transmite prin va!oare, deoarece este parametru de intrare.voidpercuqe (noel " prim){for (nod ep vp ri.m : p! ""-NUL L; ;'Y"' f) '- > lJ t:"" m)p r e l uc r c ca za p->info;}Atat vectorul , cat si listasuntstructuri liniare, iar algoritmii de parcurgeresunt asernanatori:Vc cto rul Lis t aVariabi la tolosftai de tip int pentru indlcele elementului P de tippointer catretipul noda! listeiI uent ru oarcurocre curent din vector pent ru adr esaelementul ui curentdin ustalnitializareai=O- indicele prirnului element din p-prim - adresaprimului noddin listavectorTrecerea la ele-i-i+1_ se incrementeaza indcele p-p->urm- pointeru lui i se atr ibuiementul urrnator adresanodului urrnatorConditia dei- n - indicele i are prima valoare marp NULL - adresarnemorata inpointerultenninare mare decat cea a ultirnului element p este cons tantaNULL2.6.3.6. Cautareaunuinod inlistaintr-olistase poate cauta:1. Nodul careindeplineste0 anurnitacondit ie, pecare0 notarncucondi ti esi careesteexprimatapri ntr-oexpresielcqica ce contineeel putinuncampcuinformatiedinnod; valoarea cond itiei este dependenta de intorrnatia stocata In ned. Algoritmuleste: se parcurgelistalncepanddelaprimul nod, inordineadelnlantuirea nodurilor,panase gasel?te nodul carelndepl inesteconditiasaupanas-a ajuns la sfarsitullistei .2. Nodu l care seintr-oanumita pozit ieintist apecare 0 notarn cupoz.Algoritrnul este : separcurgelistai ncepand dela primul nod, fn ordineade inantuirea nodurilor, pima cands-auparcurspo z noduri saupanas-a ajunsla sfarsitull listeiImpl ementarea algoritrnului . Se foloseste a tunctie operand cu tipul pointer catre tipul nod. Inambele vari ante:122 Impleme nta r ea struct urilor dedate-7 parametrul functiei esteprimde tipnod S8transmite prinvaloare, deoarece esteparametru de intrare;-7 variabilalccalap detippointer catrenodsefolosestepentruparcurgerealistei - esteinitializata cu adresa prirnului nod ;-7 adresanoduluigasit S8rnernoreazaInpointe rul pcarevafi ret urnatadefunctie.Varianta1nod *c a u t (nod *p r i m){for (nod p !=NULL && !condi t i e; p=p ->urm); return Pi }Varianta2 - Variabi lalccalanr detip int se folosestepentrua nurnarapozit iileparcurse- este inltializata cu valoarea1.nod " c e u t t nod *p r i m, int p a z){nod *p=p r i m; i n t nr=l;for ( ; p ! =NULL && nr urm; delete q ;}Eliminareaultimului nodPasii executat i Inacest al goritmsunt:PAS1 . Se salveaza adresanodului ulti minpointerul q.PAS2. Se cautapredeceso rul ultimului nod, prin parcurgerea listei incepanddela pri mulnod , pima lapredecesarul nod ul ui terminal (nodul care nuse leaqadenimic-adres a deleqaturaare valoarea NULL)PAS3. Predeces orul nodulu i ult imdevine nod termin al (adresa delegaturaesteNULL).PAS4 . Predecesorul nodul ui ultimdevinenodul ultim.PASS. Se cereel iberareazonei dememoriedela adresarnernorata I n pointerul q.InformaticaprimEl i min area ult i mul ui nod-- .....123Implemenlarea algoritmului . Se foloseste functia procedurala elimina_ultimOal carei para-metru ul tim de tip nod S8 transmite prin referinta, deoarece este parametr u deintrare-iesire,vo idelimina_ultim(nod p r i m, nod * &u l t i m){nod *p ,*q =u l t i m;for (p=pr i m; p ->urm- >u r ml =NULL; p=p->urm) ;p- >u r m=NULL; ultim=p ; delet e q i }Eliminarea unuinod dini nt eri or ul l isteiPentrua eliminanodul pafl at ininteriorul listei, trebuiesaleqarn predecesorul nodului pdesuccesorul lui. Dar, predecesorul unui nodnuest e cunoscut.Elimin areaunui nod dinlista l nseamna derapteliminarea dinlista a inforrnatiei pecare0 conti ne. Astf el , dinlistanuS8 va eliminanodul p, ci succesorul Sc3 U(careestecunoscut), dup a celnforrnatiadinel a fast copiata innodul p, Pasii executati inacest algoritm suntPAS1 . Se sal veaza adre sa succesorul ui nodului p inpointerul q .PAS2. Secopiazai nnodul ptoatainformatiadinsuccesorul lui (lnforrnatiapropriu-zi sainforrnatia delegat ura).PAS3 . Se cereeliberarea zone i dememorie dela adresa memorata inpoi nl erul q.PAS4. Dacasucceso ru! nodului peranodul ultim, atunc i nodul pdevine nodul ultim.Implementareaalgoritmului. Sefolosestefunctiaprocedura la el imina () ai carei para-metri sunt detipnod : p(adresanodului careseelirnlna),caresetransmiteprinvaloare,deoareceesteparametrudeintrare, ul tim, carese transmiteprinreferinta , deoareceeste parametru de intrare-iesire.vo i d elimina(nod *p, nod *&ul t i m)lnod *q =p - >u r m;delete q ii f ultim=p ; }2.6.3.8. El iberarea spatiului dememorie ocupat dellstaOaca in cadrul unei aplicatii care prelucreaza mai multe liste, nu mai este necesarauna dintreele, se va elibera int regul spatiu ocupatde lista. Prinacest algor itmseviziteazafiecare nodallistei , pomi nd delaprimul nod, pimala ultimul nod, i n ordinea delnl antui reanodurilor_ furnizatadeadresaurm din nodul vizi tat , si se elibereaza zona dememorie ocupata defiecarenod. Pasli executati i n acest algoritmsunt:PAS1 , Se initializeaza pointeru! p cu adresaprimului nod din hsta - prim (p i n[ c i q->i nfo=n ; q-c-u rmep r Ivoid aderu q ai u Lt ErnLr iod *q }{no d *p=ne wnod ; p,.->inf Q=n; q- >urrn=p; p ->u r m=NULL ; }nod * c au t.a(n od *p c.b nl{no d *q =p r i m;while (q - >i n f o urm!""NULL) q - q -c- u r m.retur n q; }void*p r i m){for ( nod * p =p r i m; p! =NUL L ; p wp - c-ur ru) cout.ccp - oLn toc c ' ' " ;}void main(){n o d *p r i m,* q;cou t .c-c vn uma r "; cinn;aci d uga_ncd (prim); / /Se a daug a primu l nodc o u t c c vnu m a r "; c i. ncc-n :while (n ! =0 )t i mp ma i. e x t s t z.i.nEo rme t. Le d e a cle uqet;( q=c a u t a (p r i m); nod u l q trebuj.e adb ug at nodu l pif (q-c i nI'o-cn) /I Dac5 s - . a jun s I a a f a rs i.t.u .I Ld s t. o i.2d a uga:.;..ult irn( q); I lnodul p s e a de.uqf ce ul tirn n odelse adauga in rata (q); I inodul p se aciauqa i n f a t.a rrcciu.LuL qcout.c-cvn uma r- "; c i n n ; }af isa r ef p rimLr } li Se afi o;> cClzJ.inf o n na;': i i l e din liE;taVari anta 2 - Se porneste de la lista care contine un nod santinela (un nod caremarcheaza sfarsitul liste i). Acest nodcontineln carnpul cheie 0 inforrnatie care are 0valoarecarefacecael safieintotdeaunaultimul noddinlista(deexemplu , In cazul uneili ste ordonatecrescator, I n carecarnpul folosit pentruordonareestedet ipi nt, seadauqaun nodcareareInacest campceamai marevaloarepentrut ipul i nt - MAXI NT). Candsevaafisa lnforrnat.adinlista. ultimul noddi nlista nuS8 mai af iseaza. Pasii executat i inacest algoritmsunt:PAS1 . Se adauqanodul santinelala lista.PAS2. Ca l limpexistainforrnatiedeadauqat execut aPAS3. Dac ainfcrmatiacareseadauqatrebuiesafielai nceputul listei, atu nc i seadauqa noul nod caprirnul noddin list asi S8 rev ine laPasul 2; altfel, S8trece lapasul urmator.PAS4. Secautanod ulTnaintea caruiatrebui e adauqat nou l nod.PASS. Seadauqanoul nodinfata nodul ui gasit S8revinelaPasul 2.tmplemcntarcaal go ritmul ui.#include#includestruct nod {int info;n od *u n n;};int n ;v o i d ad auqa s a n t. Lne La(noa v Sp r Lm){p r i m=new nod ; pri m-> inro"'-MAX. I NT;void e da uqe p ti m.t n'od *&p r i m){n o d *p =newnod ; p -c- Ln I'ocn , p -c-ur m- p r im. p ri.rn e-pi }void *q ){n o d nod ;p->lJrm=q->lJrm; p->i llo=q ->lnfo ; q - >i n o =!l; q ->urm=p ; }126 I mplemcntar cu srructuril ordcdatcnod *c a u t a(flod *p r j m){ nod *p =p r i m;for retur n pi }v oid a f isa re (n o d *p r i m) / I Nu se a fi gea za Intcrma t.La d i n u ltimul nod{f o r (no d *p =p r i m; p ->u rm ! =NULL ; p=p ->urm) c ou t p->:i. n f o " " ;}v oid ma in (){ nod *p r i m,*q ;ada uga_santinela( pr im ) ; / IS e adauga nodul santi nelacou t .c-c vnuma r " ; cinn;whi le (n !=O) II Cat timp mai e xista i n f or ma tri e de a d a uga t{i f (n-cp.r iru-o Ln f o ) j*Dac a .i nfo rrnat.La trebuie s a fie 10.inceputul lis tei */a d a u g a_prim( pr in); /I no dul p seada uga co. p r i mn o de l s e I/Se c aur a nodu I q Lna.Ln t e a ca r u i a t r ebu t etac aucc t rro d u.l, 0(q) ;} / I nodul p s e adaugainfa t a nodului qcout "numar "; c inn;}a f i s a.re (pr i m) ; }Algoritmul deinterciasare a doualiste ordonateAcest algoritmfolosest eacelasi princip iuca,i aigoritmul deinte rclasare adoi vectoriordonati . Celedoua listesunt ordonatedupaacelasi campcheie crite riu deordonareS8 obtine 0 atreia lista care contine infcrmatia dinprimele doua liste ordonata dupaacelasi criteriu, folosindacelasi campcheie. Pasii executati i n acest algo ritmsunt:PAS1. Se creeaza Lista1 ,i Lista 2 ordonate dupa acelasi criteriu si dupa acelasi camp cheie.PAS2. Se adauqa primul nod laLista3 astfel: daca inconformitate cu criteriul de ordonarefolosit treb uieadauqataintorrnati adin pri mul nodal Listei 1, at unci seadauqainforrnatia din nodul primal l.istei 1;;1 InList a1S8 trece lasuccesorul nodul uiprim,iar in Lista2lanodul prim;altfe l ,S8adauqa inforrnatiadinnodul pr imalListei 2,i i n Lista2 se trecela succesorul nodulu i pri m, iar i n Lista1 la nodul pr i m.PAS3. Cat timpnus-aajunsla starsitul List ei 1 sau alLi stei 2, executa :PAS4. SeadauqalaLista3unnoddupaultimul nodastfel : dacai nconformitatecucriteriul deordonarefolosittrebuie adauqata informatiadin nodul curent alListei1, atunci S8adauqa inforrnati a din acest nod ;;i in Lista1 S8 trecela succeso rulnodului curent , altfel , se adauqainformatia din nodul curent al Listei 2 ,i i n Lista2 se trecela succesa rul nadului curent. Se revine la Pasul 3.PASS. Dacas-aajunslasfarsi tul l.istei 1. at unci laLi sta3seadauqadupaultimul nodnodurilerarna seinLista2; altfel, laList a3seadaug a dupaultimul nodnodurilerarnaseinList a1.Imp leme ntarea algoritmului. i n implementarea algoritmului s-au folosit liste pentru carecarnpul cheie este de tip numeric intreg , iar ordonarea este crescatoare dupa valoareacarnpuluicheie. Numerele care trebuiememoratei n nodurile listelor se citesc de la tastatura invariabila n panase citeste valoarea a(are semnificatia ca nu mai exista intorrnatie de adauqat).Dinsubprogramelei ncarenuestenecesarainformatiadespreadresaultirnului nodaufosteliminateprelucrarilecaresereteralaacesta. Celetrei listeseldentificaprinadresaprimuluinod (p rim! , p r i m2 si respectiv prim3). Deoarece in acest algoritmnu este necesaraintormatiadespreadresaultimului nod, dinsubprograme au fast eliminateprelucrarile caresereferala acestaPentruparcurgereacelordoualistesefolosescpointerii q respectivr , iarpentru lista care se creeaza prin interclasare - pointerul p.Informatica127#includes t r uc t nod t int info ;nod *u r m,'};i n t n;voida d auga,..:..Dod (nod * &p r i m){ p r i.rne ne wnod ; p r i.m-c-i.n f o e n : p r i.m-c-ur meNtrl.L r }voi d adaug3_in:....- f at a(nod *q ){nod *p =new hod;p ->u rm=q->urm;p->info=q->info ; q - >info=n ; q - c-urme-pr}v o id adaugaultirn (nod *q ){nod *p =newnod ;p ->urm=NULL; }nod *c au t a {nod *p r i m){nod *p=pr i rr.;while {p- >i n f o urm ! =NULL ) p =p - >u r m;r e t urn pi }v oidcreare(nod *&p r i m) liSe creeaza 0 l ista ordonata{nod *q ;oou t .c-cvnuma .r " ; cin n ; e da uqa j nod (prim);cout"nurua r " ; c i n n ;whi le (n! =O}{q =c a u t a (prim) ;i f (q ->irlfo i n f o ; qep .r imL- ou r m, e lse {n=p r i rn2 - >i n f o ; r =pr im2 ->urm; q=pr iml;)adauga nod (pr i m3 ) ; p=prim3 ;whi le (q ! =O && r ! =O){i f (r -> info>q- >i nfo) {n eq-o Ln fo , q e-q -c- u r rri j }else {n= r- >i n f o ; rar -c- u rm r j p vp- c-urm r Iifwh i l e (q !=OJ {n=q- >i nf o; adauqa u Lt irn tp I p vp -c-u rrn. ,q=q- >u rm; )e lsewh i l e t r ! =0 ) {ne r -c-Ln fo , adauga _ult i.:Tl (p ) ; p-p-c-unn. rvr-c-urm. Iaisareiprim3J; ) / /Se afi$eaza informa\=. i iledinlistainterclasata2.6.3.10. Prelucrarea listelor simplu inlantuiteRezolvareaproblemelori ncar eorqanizati datelesubforma delistepresupunefolosireaalgoritmilor prezentati , astfel:1. Secreeazalistaprin folosireaurrnatorilor algoritmi :-7Se adauqaprimul nodla lista vida (algori tmul pentru ad auqarea l a ll sta a primu-lui nod ).7 Seadauqacateunnodlalista. Pozi tiaincareseadauqanodul depindedecerin-tel eproblemei. Dacalistanuesteordonata, adauqareasepoatefacelastarsitul128lmplcmcn tarca structurllor de datesaulainceputul lislei (al gori tmul pent ruada uqa rolai nc ep ut ul saulastarsi t u'li st ei ). Dacalistaesteordonata, S8parcurgemal intai listapentru a gasi pozi tia deinserare(ai gori t mul pentrucautaroaunui nodi nti sta) dupacareS8 inse reazanoul nodInpozit ia gasita (al gori t mul pentruadauqaro i ni nte r i oru l li stei ).2. Sa intretino l istaprin folosireaurrnatoriloralgoritmi :-,) Seadauqanoi noduri lalista . Ca ~ i la crearealistei, i nfunctiedecerinteleproble-mei S8va folosi unul dintrealgoritmii de adauqare.-,) Seel irninanoduri dinlista. Mai inlai separcurgelistapentru a gasi nodul careseelimina (al gori tmul pentru caut arc a unui nod i n lista) dup a care S8elirninanodul din pozitia gasita folosind unul dintre algori tmii pent ru cli mi nare - infunctiedepozi tiaincare a fastgasit nodul.7 Semodifiesinforrnatia dintr-unnodal listei. Mai i ntai S8parcurg e listapentrua gasinodul incaresevamodificainformatia(ai goritmul pentrucautarca unui nodinli sta). Oacalistanuesteordonatasaudacainforrnatiacare sernodificanu faceparte dintr-un camp cheie dintr-o lista ordonata, se rnodifica valoarea carnpuluirespecl iv. Daca listaesteordonatasi, prinmodificarea valori i carnpului, sepoatedistrugeaceastaordonare, semodifica valoareacarnpului, sesalveaza inforrnatiadi n nodul listei l ntr-o variabilaintermediara, 58 elirnina din vecheapozitie(al goritmulpentrucli minarcaunui noddi nHat e). separcurgelistapentruagasi nouapozitie(algori tmul pentr u caut area unui nodin li sta) ~ i 58 insereaza nodul in pozitiagasi!a (algori tmul pentru adauqarc a un ui nodla lista).3. Se obtininforrnatii dinIista Separ curgelista(al gorit mul deparcurgereali sl ei)si se viziteaza fiecare nod all istei pentrua extragedin el inforrnatiile necesare.[Swmu de cmz ISeop: exempl ificareamodului i ncare , pentru rezolvareaprobleme i, folositi algoritmii deprelucrare a listelor simplu l nlantuite ~ i implementarea lor cu aj utorul subprogramelor.Enunt ul probl emci 1. So citosto dintr-un fiier taxt linsir do numere separate prinspatiacu care secreeazD 0 listfi simpluinlantlli ta in ordinea in care sunt citite numoroto din tisior.Sa so vcrifico(facti tiste coutinenumoi numere distinctei opo! sase tuiouqedupafiecamIll/mar impar "dinlistavetonroe 100i saS8etisezenumctetedintiste. Penuutestareaprogramu!ui sevor folosi aou setuti do numere: (2, 5, 10, 3. 8) i (2. 5. 10. 5, 8, 7) .Nodur ile listei nu suntordonate conformunui criteriu. Numerele se vor cit : din fisier ~ i 58 vorscriein listaprin adauqaredupa ultimul nod. Problema sedesco mpunei nurrnatcare lesubproblerne. iar algoritmul derezolvareaunei subprobl ems esteimplementalcuajutorulunui SUbprogram:iE1l Secrtesteprimul numar di nfisier si se adauqapri mul nod lalista (nodul pri m) -subprogramul adauga nod ().~ Cat timp mai existanumerein fisier executa: secitesteunnurnar dinfisier si 5eadauqa un nod cu numarul respectiv dupa ultimul nod din lista - subpr ogramuladauga ul t im ().~ Se ver ifica dacanumereledinlistasunt distincte, astfel: separcu rgelista de laprimulnodpanalapenultimul nodsi sevenfica daca nurnarul dinnodulcurentmai existai n. nodurile care urmcaza dupa el panala sfarsit ul listei - subproqrarnul distincte () .~ Se parcurge lista de la primul nod panala starsitul ei si dacanumar ul din nod este imparse adauqadupa el un nod care contine valoarea 100 - subproqrarnul p relucrare ( ) .Informatica 129 Separcurgelista delaprimul nod panalasfarsit ul ei si seafiseazainforrnatiadinfieca re nod - subprog ramul afi s are ( ) .#include struct n od t int i nfo;n od * u r m;);fs treamf( " Li s r.e l . t xt" , i 0 5: : in) ;int nivoid a da u g a ,.; n od (nod *&p r i m, nod *&u l t i m){pr i m=newnod; prim->info=n; prim->urm=NULL; ul t im=pr i m; }voidadauga_ultim(nod *&ul t i m){nod nod ; p->infb=ri ; p->ur .m=NULL; ulti rn->urm=p ; ultim=Pi }v o id* &q, nod *&u l ti m){nod *p zonewnod ; p ->info=100 ; p ->urm=q->urm; q ->urm=p ;if (q==ultim) illtim=p ;}*pr i m){f or (nod *p""" p r i m; p->urm!:=.NULL; p=p->urm)for (nod *q =p - >u r m; q !=NULL; q=q->urm)if (p->info==q->info) retu r n 0;return I ; }v o i d prelucrare(nod *p r i m, nod *&u l ti m){for (nod *p =p rim; p!o;,o NULL; pep -c-u r m)if adauga_dupa(p,ultim); }v o id a f isa.r e(nod "p r.Lm){ for (nod * p=p r i m; p! =::oNULL; pep-c-urm) ccutx-cp - oi n focc '' ". cout-ocendf , }voidma in (){nod ep r Im, *u l t i m; f >>n adauga nod(prim,ultim};wh i le (fn) adaugaultim(ultim); f iof o s et j ,if {di s t Lnc t e tp r Lml ) cccc .c-c vz I c m e nt e l e sun t d i.s t inc tev c c e n cn.else cou t-cc ve Iement.eLe nu s unt dt s ti n c t e.vccend f afisare(pr im) ; }Enuntul problemei 2.Secit estedintr-untisier text un numet cumaxim20decifre.Saseverifice daca nurnarul esle palindrom. Pentru testarea programului se var folosi oounumere:1234321i 12345.Sevorcreadoua liste: unacucifrelenurnarului cititedinfisier. prinadauqa redupauJtimulnod, iar a doua, cu cifrelememorateTn nodurile primei liste prin adauqare In tata primului nod;;i S8vor camparacele doualiste. Din fisierse va citi fiecare cifraa nurnarului intr-o variabiladetipcharsi sevaobtinecifrascazanddin codul ASCIIal caracterului citit codul ASCIIalcifrei O. Cele doua liste se identifiesprin adresa primului nod (prim1 si respectiv prim2) prinadresaultimului nod(ultim1respectivultim2). Problema se descompuneinurrnatoare!esubprobleme, iar algor itmul derezolvarea unei subproblemeesteimplementatcuajutorulunui subprc qrarnIE]Seciteste primul nurnar dinfisier seadauqaprimul nodlaLista1(nodul prim1 ) -subprogramuladauga nod( ) .[E] cattimpmai existacaract ereinfisler, executa:secitesteuncaracter dinfisier, seconverteste Incif rasiseadauqaun nodcu citrarespectiva dupaultimul noddinLista1 - subprogramul a d aug a u l t i m () . Seadauqaprimul nodlaUsta 2(nodul pr im2 )carevacontineinfor matia dinprimulnod al Listei1 (prim1) - subprogramul adauga nod()130 Im(ll ementareast ru ct ur ilor de dat e Se parcurgeLista 1 de la succesorulprimului nod pana la sfarsitul ei se adauqa un nodcu citra respectiva inaintea primului nod din Lista 2 - subprogramu l adaugaprim() . Separcurgsi multanambe lelistedelaprimul nodpanalase v erificadacasunt egale cifrele memorate i n nodul curent din cele doua lisle - subprogramulp alindrom( ) .#includ e s t r uct nod ti n t in f o ;nod - ur mrl f s t r e a mf( "1 ista2 .t xt " , i o s: :in ) iint n ;v oidadauga nod {nod *&p r i m, nod *&u l t i m){p r i ;no:= newnod; prim->infoo=C1 ; prim->urm=NULL; ul tim=prirn. ;}voi d adaugu_u ltim(nod{nod *p=newnod : p ->info=n; p ->urm=NULL:ul t im=p ; }voi d acta uga_ prim(nod *&p r i m){ n od - pv new nod ; p- >i n f o=n ; p-c- u rmepr Lm, p r Lm-p rji nt pa l i ndr om(nod *p r i ml, nod *p r i m2 ){ nod "p , *q;f or (p=priml, q=p rim2 ; p ->urm! =NULL; p=p->urrn, q=q - >ur m)if (p ->info !=q->info) r eturn 0 ;r eturn I ; }v o i d ma in(){char c ; nodr >c n=c -'O '; adauga nod Lpr Lml s u Lt i mLj rwhil e (fcl ( n=c -' O' ; a da uga_u l t i m(ult i ml ) ; } f . c lo s e ( ) ;n=priml ->info; f o r (p=priml - >u rrn; p !=NULL; p=p->u r ml{n=p - >i n f o; ada uga_prim (pr i m2 ) ; }if (pa l ,indrom (p riml ,pr im2)) cOllt"Es Le pa lindrom" ;el s e cout " Nu estc pa lind rorn " ;}Enuntul problemei 3. Se citeste dintr-un fiier text un :;ir do numereseparateprinspa(iucu care socreeaz80 lista simplu inl8n(uita in ordinea in care suni cilitenumereledin Iisler.Se moi cnest de /0tastatura un numar x. Sa se caute $i sase $tearga din listnodu/ carecontine acest nutner. Pentru testarea programII/IIi seva tolosi situt de nllmere: (2, 5. 10, 3,8). iet pentru x patruvetori: 2. 5, 8 $i 7.Nodurile listei nu sunt ordonateconformunui criteriu . Numerele se vorcitidin fisier se vorscriei nlistaprinadauqaredupa ultimul nod. Problema sedescompunei nurrnatoarelesubprobleme, iaralgoritmii pentrurezolvarea subproblemelor sunt irnplementati cu aj utorulsubproqrarnelor:[i>] Se citestevaloar ea pentrux dela tastatura. Se citeste prirnul nurnar dinfisier si seadauqa primul nod lalista (nodul prim) -subprogramul ada u g a nod ( } . timprnai exi stanumerei nfisier execut a: seciteste unnurnar dinfisier seadauqa un nod cu nurnarul respectiv oupa ultimul nod din lista - subprogramula d a u g a u l tim () . Daca primul noddin listacontine numarul x, atunci se elirninaprimulnod(subprogra-mul e limi n a _ p r i m( )) ; altfel , se cautapredecesorul nodulu i carecontine nurnarulx(subprogramul cau ta() ) si dacaseacestnod, atunci sesterqenodul careurmeazad u pa el (subprogramul el imina _ u rm () ).Informatica 131 Separcurgelistadelaprimul nodpanalasfarsitul ei si seafiseazainforrnatiadinfiecarenod- subprogramu l af Ls er-e ().#i n cl ud e struct nod tint info ;n od - u rm r j f s t r e a mf ( " lista3 . t xt " , ios:: in);i nt n ,x;void edauqa nod (n od *&p r i m, nod *&u l t i..' u ){p r i m=newnod ; u lt i m=p r i m; prim->info=n ; p rim->ur.m=NULL; }v oidadauga_u l tim(nod *&u l ti m){nod *p=-newnod ; p ->info=n ; p->urm=NULL;ult.i.m=p ; }nod * cauta {nod && p ->urm->info!=x) p=p->urm;return p ; }v o i d elirnina prim (n od *&p r i rr.}{nod *q =p r i m; prim=prim->urm; delete q ; }voidelimina_urm(nod *p ){nod *q =p - >u r m; p ->urm=p->urm->urm; delete q ;}voi d afisare(nod p r i m){f o r {nod *p =p r i m; p ! =NULL; p =p - >u r ml cout p - >i n f o" ":coutendl;}void mai n ( ){no d ep r i m, "ulc i m, "'p ; cout.c-c" x e " ; cin x;f o; (prim, u ltim);while (fn)f . c l o s e( ) ;if (prim->info==x) elimina prim(prim);e lse {p =c a u t a(p r i m) ;if (p - >u r m! =NULL ) elimina_urm (p ) ;}afisa=e(prim);}Enuntul probl emei 4.Se citestedintr-un tisier text un de numereseparateprin spatiucu cam se creeaza0Iista simpluinlantuilain ordineain care sunt cilite numereledin tisier.Sa seeiiminedin tist vetotite care se reoete, in afara de prima lor aparitie. Pentru leslareaprogramului se va tolosi irul de numere: (2, 4, 9, 9.9, 6, 2, 9, 9) .Nodurile listei nu sunt ordonate conform unui criteriu. Numerele se vor cifi din fisier se vorscriein listaprinadauqaredupaultirnul nod. Problema sedescompunein urrnatoarelesubprobleme, iar algoritmi ipentrurezolvareasubproblemelor suntirnplernentat i cu ajutorulsubprogramelor::E1I Seciteste primul nurnar dinfisier si seadauqa primul nodlalista (nodul prim) -subprogramul adauga nod ( ) . Cat timpmai existanumerei nfisier executa: secitesteunnurnar dinfisier seadauqa un nod cu nurnarul respectiv dupa ultimul nod din lista - subprogramuladauga ul tim(). 5e elimina din lista valorile care se repeta, astfel (subprogramul prel ucrare () ):Pentruunpointerpcare indica fiecare nod din lista, incepandcu primul nodpfmalap.enultimu l nod, exe cuta:-7 Se initializeazapointerui q cu adresa nodul curent (indicat depointerul p).-7 Cat timppointerui q nuindicaultimul nod, executa: daca nodul indicat depointeru l pcontineacelasi nurnarcusuccesorul nodului indicat depointerul q,132lmplcrnenrarea st r uct ur ilor dc date: atunci S8 elimina succesorul nodului q (- subprogramul eLi.m.i .na u rm n ):! allfel , pointerul q indica succesorul nodului. SeparcurgeIistadelaprimul nodpanalasfarsitul ei seafiseazainformal iadinfiecarenod (subprogramu l afisare ( ) ).#incl u destruct n od lint inf o;n o d * u rm; } ;f s t r e amint n ;void adauga nod (nod *&p r irn, nod *&u l t i m){p r Lm- n ewnod; pr Lm-c-Ln foe x , prirn->unn=NULLi ultim=prim; }v oid a dauga_ult im{nod *&u l ti m}{nod *p=newnod ; p- >info=x ; p->urm=NULL; u lt im->urrn=p ; ultirn=p; }v o i d e limina _ urm(no d *p }{ nod * q=p ->u r m; p->u r :n=p->urm->urm; delete q; }void *p r i m){::od *p ,*q ;for{n=p->i n f o; q=P iwhi l e (q! =NULL){i f (q->urm!=NULL &&q->t: rm->info="'-'n) elimi na_urm(q);e l s e q =q->urm; } } }void a fisare{ncd *p r i rn){f o r (nod u Ym) cout ccp -c- Ln f o-cc" ";cout e ndl;}void mai n {} *p r i m, *u lt i m; f n; adauga_nod( pr i m,ultiml ;while (f :1) a dauqa_ul ti rn(u l t i m); L c lo s e(};p reI ucra re (p r i m) ; afisar e(p r im);}Enuntul problemei 5. AdunareaadOllapotinooma. Se citesc oimr-ut: Iisier text de peprima linie un numar n1, care teprezintenumiuut oe coeiicienti nenuli oi utiui palinom, apaidopeurmatoarele111 linii coeticientiinenuli i gradlll, depetinieurmatoareunnumar n2carerepte ziatenumetut docoeticienti nenuli ai cetui deal doi/eapalinomi apai depeutmetoetelelmii coeticientii nenuli i gradul. Sa secreezecuacestointormetit oouelistosimpluinlernuite i sa se adune cele doue palinoame. Coeticiontut i gradul tiecetui termendinpolinomul sumasevor salvaintr-untisier. Pentrutestareaprogramului sevot folosipotinoernete -lOx4+5x2-3x3x3+7/+x+2.Sevor creacoualistei ncaresevormemoraceledouapolinoame. lnformatiautilavafimernorata intr-o i nregistrare cu doua carnpuri: un camp pentru coeficient siun camp pentrugrad. Ambele liste se creeaza prin citirea datelor din fisier adauqare dupa ultimul nod. inatreia lista se va memora palinomul obtinut prin adunarea celor doua polinoame. Cele trei listeseidentifica prin adresa primului nod(prim1, pri m2 respectiv pri m3) si prinadresaultirnului nod(ull im1, ul li m2 respectiv ull im3). Problema de creare a listei surnaapolinoamelorsedescompunei nurrnatoarelesubprobleme, iaralgoritmii pentrurezolvareasubproblemelorsunt impiernent ati cu ajutorul subprogramelor:IE]Se citescdin fisler n1 si coefi cientul gradul primului termendin primulpolinom. Seadauqa primul nod la listaL1 (nodul prim1) - subprogramul a dauga nod () .E?] Pentruurrnatoarelen1-1perechi denumeredinfisier , executa: S8 citescdinfisiercoeficientul gradul unui termen al primului polinom si se adauqa un nod cuinforrnat ia respect ive dupa ultimul nod din lista L1 - subprogramuladauga_ ul tim() .Informat icii133 Secitescdinfisier n2 coeficientul si gradul primul ui termendinal doileapolinom.Se adauqaprimul nod la lista L2 (nodul prim2) - subprogramuladauga nod( ) . Pentruurrnatoarelen2-1perechi denumeredinfisier, exec uta :S8 dtesc dinfisiercoef icientul gradul unui termen al celui de al doilea poli namse adauqa un nod cuinformatiarespect ive dupaultirnul nod din lista L2 - subprogramul adaug a _ u l tim( ) . Seadauqaprimul nod(prim3) lalistaL3cuurrnatoareainforrnatie: daca gradul dinprimul nod din listaL1 este egal cu gradul prirnului nod din lista L2, at unci gradulesteegal cugradul nodului dinLista1,iar coeficientul esteegalcusumacoeficientil or dinnodurile celor doualisteinambeleliste se trece la nodul urrnator : allfel , daca graduldin primul nod dinlista L1 estemai mare decat gradul primului nod din lista L2, atuncigradul esteegal cugradulnodului dinLista1, iarcoeficientul esteegal cucoeficientulnodului dinLista1inLista1 setrecelaurrnatorul nod; altfel , gradul esteegal cugradul nodul ui din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 inLista 2 S8trece la urmatorul nod - subprogramul adauga n od () . Cat timpnus-aajuns lasfarsitul Listei 1 si alListei2, exec ut a: seadauqaunnod lalistaL3 dupault imul nod, cuurrnatoareainforrnatie: dacagradul din nodul curent dinlista L1 esteegal cugradul nodului curent dinlistaL2, at unci gradul esteegal cugradul nodului din Usta 1, iar coeficientul esteegal eu sumaccefi cientilor din noduril ecelor doualiste inambele listesetrecelanodul urrnator : allfel , dacagradul dinnodul curent dinlistaL1estemai maredecat gradul dinnodul curent dinlistaL2,at unci gradul esteegal cu gradul noduluidin Lista1, iar coeficientulesteegaI cu coefi-cientul nodului din Lista1>; i i n Lista1 se trece la urrnatorul nod; allfel , gradul este egalcu gradul nodului din Lista 2, iar coeficientul este egal cu coeficientul noduluidin Lista 2inLista 2 S8 trece la urmatorul nod - subprogramul adaug a _ u ltim () .#i ncludef streamf1( " l ista5 . t xt " , ios:: in) , f2t vp o Lj nom. r x t", ios: : ou t } ;struct nod lint e ,g ;nod eu r rrr j ,int e ,g ,:1 ;voi d ad auga nod { nod *&p r i.."TI, no d *& u l tim) prim- >g=g ; }void*p=ne wnod ; p->u r m=NULL;p - >c =c ; P->9=9 ;}void c r ea r e(nod *&p d.:n, nod *&u lt i ml{f l c g; a da uga_ nod lpr i m,ultim) ;f or ( i n t i'-".2 ; t c-n , i -'- t ) { l c gi adzru qa ul ti m{u l ti rn) ; } }void a d un a r e(noel - p r irn I. nod *p r i m2 , n od * &pr im3 , I1 C'Jd * &u1 t irr,3.1{nod *p =p r i ml , *q=p r i r:12;if l p - >g ==q - >g) {g =p - >g ; c =p- >c +q- >c ; p=p->ur m; q=q->u r m; }else i f (p ->g>q- >g) {g=p- >g ; c=p ->c ; p=p- >urm; }else {g =q- >g; c =q- >c ; q=q->urm;}adauga nod( prim3 ,ultim3 ) ;while (ql =NULL && p !=NULL){i f c=p->c+q->c ; p =p ->Jrrn;elseif (p - >g >q - >g) { g=p- >g; cep->c p =p- >u r rn; }e lse c=q->c ; q=q ->urm; }adauqa u l t i m(u l ti m3 ) ; }if {p ! whi le (p ! =NULL ) ( g=p - >g; c=p->c ; adaug a ultim(u l ti m3 ) ;}else134Implcmentarea structurilor dedatewhile (q !=NULL) ( g=q- >g; c v q-c-c r edeuqe \J1tim(ultim3); } )voidafisare{nod *p r i ml(for (nod *p=p r i m; p !=NULL; p=p - >ur rn) c out p - >c " " p - >gendl;cou t e nd l;)voi d salvare(nod *p r i m){f or (nod *p=p r i f:l ; p ! =NULL; p=p - >urm) f2 p->C " " p - >gendl;}v oidmain ()( noc *p r i ml ,*u lt i rnl ,*p r i m2 ,*u l ti m2 ,*p r i m3 ,*u l ti m3 ;int l"11 ,n2 ;f l oc-n L: n=n l; creare {priml ,ultiml ) ; afisare (priml);n=n2 ; creare (prim2 ,ultim2); af i s are {prim2 ) ;a dunare (priml ,prim2 ,prim3 ,ult im3 ) ; afisare lprim3 ) ; salvare {prim3 ) ; f 2 .cl os e() ; }Enuntul probl emei 6. Reuniunea!ji intersectiea doua muttimt. Se citesc dintr-untext do pe primalinie un numar n1, care reprezintfJ numeru! de elementeale ptimei tnuttimi.apoi depe urmatoareatinieelementele muuimit, depeliniaurmetoere unnumer n2-numerut deelementealeceleide adoua muttim), epoi depeurmatoareatinie elementelemuttnni'. Sa se determine reuniuneai intetsectie celor doua multimi. Pentrutestareaprogramului se vor folosi doua seturi de date de introte: mu/rimile A={1,2,3,4,5} iB={4,5,6,7} i multitnite A={1,2,3} i B={4,5}.Se vor crea doua liste i n care se vor memora cele doua rnultirni.Ambele liste se creeaza princitirea datelor din fisier adauqare dupa ultimul nod. ina treia lista se va memora reuniuneacelor douamultirni, iar inapatralista - intersectia. Cele patru listeseidentificaprin adresaprimuluinod(prim1, prim2,prim3"i respectivprim4)"i prinadresaultimuluinod(ultim1,ull im2, ullim3 " i respectiv ultim4).Pentru determinarea reuniuniise vor executa urmatorii pasi:Pas1. Se adauqaprimul nodla Lista3 (nodul prim3) care contine numarul din primul nodal Listei 1 (pri m1).Pas2. Se parcurgeLista1 dela succesorul primuluinodpana lasfarsitul ei " i se adauqaun nod cu numarul respectivdupa ultimul nod din Lista3.Pas3. Pentruli ecarenoddinLista2, exec uta : separcurgeLista1si dacanurnarul dinnodul curent dint.ista2nuS8gas8ii teinUsta1, atunei seadauqaunnodcunurnarul respectivdupa ultimul nod din Lista 3.Pentru determinarea int ersecti ei se vor executa urrnatorii pasi:Pas1. Se initializeaza Lista 4 ca lista vida (prim4=NULL si ult im4=NULL).Pas2.Pentrufiecar enoddint.ista1, executa: separcurgeLista2si dacanurnarul dinnodul curent din Lista 2se gase" te in Lisla 1, at unci se adauqaun nod cunumarul respectiv ca prim nod i n Lista 4 (nodul prim4).Pas3.Daca s-aadauqat primul nodlaLisl a4, atunci pent ruunnoddinLista1 delasuccesorul nodului curent panalaultimul nod, executa: separcurget.ista2dac a numarul din nodul curent din Lisl a 1 se gase"te i n Lista 2, at unci se adauqainLista 4, un nod cu nurnarul respectiv, dupa ultimul nod.struct nod t i nt i n :o;nod - u rn. r} ,fstream i nt x ;voi d adauga_ nod( nodIII fnrill aticii135{p r i rnvne wnodi pri rn -c- Ln f oex r pr irn- >u r m=NULL; u LtImep r i.mrIvoid a d a u ga_ultim( nod *&u l ti m){no d - penew nod ; p- c- Ln f c -cx, p ->unn=NUL L ; ult i m- >u r m=p ; ult i m=p ; }voi d c r e a r e{nod *&p r i m, nod *&u lt i m)l i n t n ; f nx; ada uga_flod (p rim, ultim);for (i n t i =2 ; i unn ip !=NULLi p- -p->urm) l x=p->infoi adauga u ltim{ul tim3) ; }f or(for (q=p r i ml, ga s i t =O; q !=NULL &&ga3it=l ;if ( ! g a s i t i {x e p -c-Lnf o , adauga_ult.i:ntultim3);} } }voi d .i n t e r s cc t LeLnod e p r i.rnL, nod *p r i m2 , nod *&p r i m4 , nod *&L:. l ti m4 }( nod *p ,*q ; int gasit ;ultim4=NULL;f o r (ga s i t=O, p ""'p r i m1; p! =NULL &&i qas i t , p=p ->urm)for (q=prim2 ; q !=NULL &&q=-q->ur m)i f (p - >info==-q->info) {g a s i t = l ; if (ga s i ':)( a da uga non (p r i m1 , u l : i m4 ) ;f or ( ; p!p=p - >u ern){for (gas i t =O, q=- p r i m2 ; q!=- NULL && !gasit ; q=q- >ur m)if (p->info=- =q->info) gasit=l;i f (g a s it} {x=p - >i n f o ; adauga_ultim(ultimt;);} } }}void a :is a re(nod *p r i m){for {nod *p =p r i m; p!:-:"NULL ; p=p- >u r m} c out p- >i n f o" II .cou t e nd l ;}v o i d mai n () c cee ce (p r .iml, ul timl); c r ee r e (prim2 , ul tim2}; f _close ( ) ;r cuni.une (priml , prim2 , prim.S, ul t i m3 ) ; ccucccvnecnt unee- " ; afisare (prim3) ;Lnt c r sect i e(pr iml, p r i.mz , p r i.mq , u Ltim-1) ; c o u t-cc" Intersectia= " ;if {prim4l=NULL)else cout"Mul t l :ne 2. vida " ; } '*"o 0 Scrieti cateun program caresa rezolve cerinteleflecarei probleme. Fieca-Tenui --- reproblemase va deseompune i nsubprobleme algoritmul pentru rezol-vareaunei subproblemesevaimplementacuunsubprogram. Datelesetransmi t intre subprograme eu aj utorul parametrilor de comunicatie nu al variabilelorglobale. Dupa executarea unei operatiidepreluerare a li sle; simplui nlant ui t e. se vor afisanumereledin nodurilelistei pentruaseverificadacaoperatiadepreJucrare s-aexecutatcorect. Sevor alegeseturi dedatedeintrareastfel l ncat saseverificealgoritmul petoatetraseele lui. Pentru urmatorii 18 itemi innodurile listelor se rnernoreaza numere i ntregi. Sirul denumere se citeste dintr-un fisier text in care sunt serise pe acelasi rand. separate prin spatiu1. Secreeaza0 listai ncareordineadeaccesestecea i ncaresunt cititenumerele. Semai citescdelatastatura couanumerex y. Se insereazai n listanumarul yinainteanurnarului x.2. Se creeaza0 lista i n careordinea deaeces este inversa celei i ncaresunt citit e nurne-rele. Se elimina din lista eel mai rnic nurnar si eel mai mare nurnar.1361m ilcmcntarca st r ucturilor dedate3. Se creeaza0lista ~ i S8afiseaza in ordineainversa citirii dinfisier numai numerele pare.4. Secreeaza0 listaincareordineadeaceesestecea incaresunt cititenurnereledinfisier. Semai citesteunnurnarnde latastatura. Se afiseazaelementul cunurnaru! deordinen dinlista. Oacanuexi sta, S8 afiseaza unmesaj de informare.5. Secreeaza0 listai ncareordineadeaceesesteceaincaresunt cititenumereledinfisier . Seinsereaza inainteafiecarui nurnar factorii sai primi.6. Secreeaza0 listaincareardineadeacees esteceai ncaresunt cititenumereledinfisier . Seinsereaza i ntrefiecarepereche denoduri eel rnai maredivi zor comunal celordouanumere.7. Se creeaza doua lisl e incare ordinea de acces este cea incare sunt citite numerele dinfisiere. Se creeaza a treia lista prin concatenarea llstei care are cele mai putineelementelalistacarearecelemai multeelemente. Dacalisteleauacelasi numar deelemente, se va adauqalista a doua la prima lista.8. Se creeaza doualiste incare ordinea de acces este cea incare sunt citite numereledinfisiere. Se creeazaa treia lista prin concatenareaceleide a doualiste la prima lista. Seelirnina din a treia lista numerele care S8 repeta.9. Se creeaza0lista i n care ordinea de acces este cea incare sunt citite numerele din fisier.Se divizeaza lista indoua liste: una care coniine numere care sunt palindrom si una carecontine numerelecarenu sunt palindrom. Se salveaza lista cu numerepalindrom intr-unalt f i ~ i e r . Daca nu au existat numere palindrom, in fisier se va sene un mesaj de informare.in lista care nu confine numere palindrom se insereaza cupa fiecare numar inversul sau.10. Secreeaza0 listaincareordineadeaccesesteceaincaresunt cititenumereledinfisier. Seafiseaza numerele careauultimeletrei cifreidentice, seeliminadin listanumerelecareauultimeletrei cifreconsecutivesi seinsereazavaloarea10i nainteanumerelor care au suma ultimelor trei cifre eqala cu 10.11. 8ecreeaza0 listai ncareordineadeaccesesteceaincaresuntcititenumereledinfisier. Se afiseaza numerele care au mai mult de doidivizori primi , se insereazadivizoriiproprii intatanumerelorcareaumai multdetrei divizori proprii si seelirninadinlistanumerele care au eel putin doua cifre identice.12. Se creeaza0 lista numai cu numereleprime din fisier. Se afiseaza eel mai mare numarprim ;;i eel mai micnurnar prim. Se verifica daca lista contine numai numere distincte;;iseafiseazaunmesaj deinformare.Dacalistanucontinenumai numere distincte, seelirnina numeredin lista astfel tncat sa contina numai numere distincte. Se salveaza listacreataintr-unaltfisier. Dacanu au existat numereprime infisier, se vascrie unmesajdeinformare. (l ndicati e. Se va crea0 lista ordonatacrescator ~ i se vorafisanumereleprimedinprirnul nod ~ i din ultirnul nod) .13.Se creeaza coua liste cu numerele citite dinfisiere. in primul fisier numerele suntordonate crescatcr, iar i nal doilea fisier numerele sunt ordonate descrescator. Secreeaza a treia lista prin interclasarea primelor coua.14.Secreeaza0 listai ncareordineadeaccesesteceaincaresunt cititenumereledinfisier. Sa S8 inverseze ordinea de acces i n lista, astfel incat parcurgerea sa se taca dela ultimul nurnar catre primul nurnar. (lndicati e. Se rnuta ultimul nod la i nceputul listei ;;iapoi, panaseajunge lanumarul memorat laadresacare afost a primului nodseinsereaza nodul ulti m dupa ultimul nod inserat.)15.Secreeaza0 listaincareordineadeaccesesteceaincaresunt cititenumereledinfisier. Sase afisezeinordineinversanumereledinlista. (Indlcatle. Seimplernenteazaun algoritm recursiv de parcurgere a listei.)I II formatid 13716. Se creeazaa listaordonatacu numerele din fisier si se divizeaza apoi lista indouaIiste:una cu numere pare una eu numereimpare.17.;n fisier sunt memo rate foartemulte numere (maxim10.000). Foarte mul tedint re acestenumereS8repeta(exists maxim100denumeredistincte). Secreeaza 0 lista ordonatacrescator numai cu numerele disti ncte si eu frecventalor de aparitie. Se aflseaza eel maimarenumar si eelmai rnicnumar . Se calculeazamedia aritrnetica a nurnerelorcareauvaloareaceamai maresauauvaloareacearnai mica seafiseazanumai numeretecare sunt mai mari decal media aritrnetica.18. Pentru douarnultirni de numere AB sa se determinediferent ele A-BB-A.19. 5e citeste dintr-unfisier text un nurnar cu maxim 20 de cifre. Se creeaza a lista cu cifrelenurnarului, S8eli rruna din lista cifrete parese afiseaza nurnarul astfel obtinut.20. Se calculeazaprodusul adouapolinoame. lnforrnatiile despre cele douapolinoameS8citesc dintr-unfisi er. (Indi cat ie. Pentrufiecarenoddinprimalistaseparcurgeadoualists iii. daca produsul coeficientilor nu este nul, se creeaza un nod i n iista a treia care vaavea coeficientul egal cu produsul coeficientilor gradu l egal cu suma gradel or. l.ista atreia estea lista ordonata descrescator dupa grad.)21. 8ecreeazadou alistecu nnoduri respectiv mnodur i carecont innumereintregigeneratealeatoriu inintervalul [a.b] . Valorile pentrunurnarul de noduri n, si respect iv rn,si pent rulimiteleintervalului , a b, se citesc delatastatura. Sa se afiseze numainumereledistinctedinceledoua liste !;) i nurnarul careareceamai maretrecventadeaparitie incele doua liste.2.6.4. Algol'itmi pcntruprelucrarca listclor circulare simpluinlan!lIiteAlgoritmii deadau qareaprimului nodlati st avi dasi deada uqaredupaullimul nodsunt la fel ca si cei de la listele simplu l nlantuite:Lista circulara simplu ln tantuuaultimprimI info-,-I urmI,info I r: infoI urmII I'.infoI urI"lI2.6.4. 1. Crcarc al i st c iDeoareee inalgoritmii depreluerare trebuie sa se cunoasca adresaprirnului nod,esteimpor-tanta adauqarea primul ui nodla listavi da. Pasii algo ritnl ului de croaro a unei liste sunt:PAS1. Se adauq a primul nodla lista(nodul prim )PAS2. Cat limp mai exists inforrnatie exec uta: se adauqa un nod la lista dupa ultimul nod.PAS3. Se leaga ultimul nod deprimul nod.Impl cmcntarea al gori tmului. Se folosestefunctia proceduralac reare ( ) at carei parame-trueste primdetipnod : caresetransrniteprinreterintadeoarece esteparametru deintrare-ieslre.8efoloseste variabila globalanpentru citirea inforrnatiei din nod. Se conside-ra ca nu mai exista intormatieatunci cand valoarea citita pentrun are valoarea O.voi d c reare (nod *&p : i o )( nod *u l t i m; cin n; (cin n;ul t.i m-c-ur-mopr-a m }138 Implcmenta r ca strudurilor dedate2.6.4.2. ParcurgerealisteiDeoarecelistacircularanuconti neunultimnodcare sa fieconside rat catermi nator allistei , S8va consideracanod careterrnina lista nodul prim. Pasi i algoritmului deprelu-crarea unei liste circularesunt:PAS1 . Se prelucreazaprimul noddinlista(nodul prim).PAS2. Pentru l iecare nod dinlistalncepandde la succesorul nodului primpanalaprimul nod, executa: S8 prelucreaza nodul curent.Impl ementareaalgoritmului. Se foloseste functiaprocedurala parcurge(J al carei para-metr u p rimdetip nod S8 transmiteprinvaloa redeoa receesteparametrude intra re.vo idpa r cuge(nod *p r i ffi ){l i se prel ucreaza prim->info ;f or (nodp=p- >urm) I /se prelucreaza p->info; }2.6.4.3 . Eliminarea unuinoddinlistiiDacaS8elirninadinlistanodul careurmsa zadupanodul curent ptrebuiesaS8verificedacaacest nodnuestenodul prim, ca sanuS8piardaadresaprimului element di n lista.Pasii algoritmului de eliminare a nodului urrnator nodului curent sunt:PAS1. Sesalveazaadresasuccesorului nodului p i n pointerul q.PAS2. Se leaqanodul p de succesorul succesorului lui.PAS3. Dacasuccesorul nodulu i peranodul prim, atunci succesorul nodului pr imdevinenodul prim.PAS4. Se cereeliberarea zonei dememorie dela adresamernorata inpointerul q.Implementareaalgoritmului. Se folosestefunctia procedurala elirnina_urm() ai carei para-metri detipnod sunt: p (pentruadresanodului precedent nodului ceS8elirnina), caresetransmiteprinvaloaredeoareceesteparametrudeintraresi prim, caresetransmiteprinreferinta. deoarece este parametru de intrare-iesire.v