Sunteți pe pagina 1din 3

1 Liste circulare

O lista circular se obine dintr-o list liniar, atunci cnd ultimul element al listei pstreaz legtura ctre primul element al listei. Astfel, pointerul de legtur din ultimul element al listei pstreaz adresa primului element. Listele circulare se clasific n: - liste circularesimplu nlnuite - liste circulare dublu nlnuite info inf urm info inf leg urm info inf leg urm info inf leg urm

Operaiile de baz asupra listelor circulare sunt: 1. crearea listei circulare 2. parcurgerea a listei circulare pentru afiarea elementelor sale 3. stergerea ultimului element Structura unei liste circulare simplu nlnuit struct nod{ int inf; nod* urm; }; nod *p,*c,*u,*q; int n,i; Crearea listei circulare simplu nlnuit void creare(nod*&p,nod*&u,int x) { cout<<"n=";cin>>n; for(i=1;i<=n;i++) { cin>>x; adauga(p,u,x); } } Adugarea ntr-o list circular simplu nlnuit Functia presupune crearea unei LSI la care se adaug legtura ultimului nod la primul nod al listei. void adauga(nod*&p,nod*&u,int x) { q=new nod; q->inf=x; q->urm=0; if(!p) p=u=q; else{ u->urm=q; u=q; } u->urm=p; //se face legatura ultimului nod cu primul } Parcurgerea listelor circulare simplu nlnuit necesit o atenie deosebit. Pornind de la un element al listei, trebuie s verificm faptul c nu ajungem s l prelucrm nc o dat, situaie n care se ajunge la parcurgerea circular nesfrit. Algoritmul va fi: - Se efectueaz operaii asupra primei nregistrri(se afieaza informatia de exemplu) - Se trece la cea de-a doua nregistrare - Plecnd de la cea de-a doua nregistrare cu nodul c, -Atat timp cat nu s-a ajuns la prima nregistrare: - se efectueaz opearii asupra cmpului informaional(se afieaza informatia de exemplu) - se trece la urmtoarea nregistrare void listare(nod* p) { q=p; // se afiseaza informatiadin primul nod si se trece la urmatorul nod al listei cout<<q->inf<<" "; q=q->urm; while(q!=p) // afisam nodurile cat timp nu am ajuns la primul nod { cout<<q->inf<<" "; q=q->urm; } cout<<endl; } Stergerea ultimului nod presupune parcurgerea cu un pointer c lista pana la penultimul nod, se pastreaza inregistrarea lui u in q, se stabileste legatura lui c cu primul nod al listei, dupa care se sterge ultimul nod u. void sterge_ultima(nod*&p,nod*&u) { c=p; while(c->urm!=u) c=c->urm; q=u; c->urm=p; u=c; delete q;} Inserarea ntr-o list circular, operaie n cazul creia nu conteaz locul n care se realizeaz aceasta (n sensul c nu putem vorbi despre inserare nainte, napoi; exist doar inserare

2
la mijloc) este identic cu inserarea ntr-o list simplu nlnuit, atunci cnd aceasta se realizeaz n mijlocul unei liste, mai exact ntre dou elemente. Cea mai puternica tip de lista este lista circular dublu nlntuit. Diferena ntre aceasta i lista anterioar este aceea c fiecare legatur are dou sensuri. p st inf dr st inf dr st u inf dr

Structura unei liste circulare dublu nlnuit struct nod{ int inf; nod* st,*dr; }; nod *p,*c,*u; int n,i; Adugarea ntr-o list circular dublu nlnuit void adauga(nod*&p,nod*&u,int x) { q=new nod; q->inf=x; q->st=0;q->dr=0; if(!p) p=u=q; else{ q->dr=0;q->st=u;u->dr=q;u=q; } u->dr=p; p->st=u //se leaga ultimul nod la primul si invers } Parcurgerea listelor circulare dublu nlnuit are urmtorul algoritm: - Se efectueaz operaii asupra primei nregistrri(se afieaza informatia de exemplu) - Se trece la cea de-a doua nregistrare - Plecnd de la cea de-a doua nregistrare cu nodul c, -Atat timp cat nu s-a ajuns la prima nregistrare: - se efectueaz opearii asupra cmpului informaional(se afieaza informatia de exemplu) - se trece la urmtoarea nregistrare void listare(nod* p) { cout<<p->inf<<" "; c=p->dr; while(c!=p) {cout<<c->inf<<" "; c=c->dr; } cout<<endl; } Stergerea ultimului nod are urmtorul algoritm: - se poziioneaz pe nregistrarea dinaintea lui u, u st (acesta va deveni u) - se pstreaz nregistrarea u n variabila q - se stabilesc legturile ntre u->st i p - se distruge q void sterge_ultima(nod*&p,nod*&u) {q=u; u->st->dr=p; p->st=u->st; u=u->st; delete q;} Probleme propuse: 1. Prezentai drumul parcurs de o carte pornind de la proprietar, la toti elevii unei clase, traseu ce se va ncheia tot la proprietar, folosind o lista circulara simplu inlanuit . 2. struct nod{int inf; nod*next;}*a,*b,*c; void main() {a=new nod; b=new nod; c=new nod; a->inf=7; b->inf=9;c->inf=9; c->inf=(a->inf+b->inf)/2; a->next=b; b->next=c; c->next=b; printf(%d %d %d,a->next->inf, b->next->next->inf, c->next->inf); } a) 7,8,9 b)8,8,8 c)9,7,8 d) 9,9,9 3)S se creeze o list dublu nlnuit care conine numere ntregi. Dndu-se o valoare a, s se elimine din list primul i ultimul element egal cu a. 25 34 12 7 9

3
4)Fie lista de mai sus: Ce va afia urmtoarea secven: cout<<p->urm->urm->prec->inf<<p->urm->prec->urm->inf; a)34,34 b)34,12 c)12, 12 d) 12,34

S-ar putea să vă placă și