Sunteți pe pagina 1din 3

Liste circulare

In unele aplicatii este necesar sa se prelucreze structuri de date inlantuite simple sau duble
circulare. Acestea se obtin din liste liniare printr-o singura operatie daca lista este simpla sau prin
doua operatii daca lista este dubla:
Fie urmatoarea lista dubla definite astfel:
struct nod
{int info;
nod * next,* back;};
nod*prim,*ultim;
prim ultim
0 0
Lista devine circulara prin operatiile:
ultim->next=prim !!urmatorul ultimului devine primul
prim->bac"=ultim !!precedentul primului devine ultimul
#rin urmare nici un nod nu va mai contine pentru campurile $next sau $bac" valoarea 0
%ultimul si primul in cazul listelor liniare& ceea ce va determina modificarea functiei de parcurgere
in scopul prelucrarilor .
prim
ultim
Iata o solutie de generare a unei liste duble circulare de intregi pornind de la o lista liniara
dubla si o modalitate de parcurgere a listei circulare astfel obtinute:
'include(iostream.)>
'include(conio.)>
struct *od
+int info
*od $next,$bac"-
*od $prim, $ultim
int n
void creare.lista%&
+*od $c
c=ne/ *od
cout((0info 0
cin>>c->info
if%1prim&
+prim=c
prim->next=0
prim->bac"=0
ultim=prim
-
else
+ultim->next=c
c->bac"=ultim
ultim=c
ultim->next=0
-
-
void listare.stanga.dreapta%&
+*od $c
c=prim
/)ile%c&
+cout((c->info((0 0
c=c->next-
-
void creaza_lista_circulara()
{ultim->next=prim;
prim->back=ultim;
}
void afiseaza_lista_circulara(od !c) "!se parcurge lista pornind de la o adresa transmisa
{for(int i=#;i$=n;i%%)
{cout$$c->info$$& &;
c=c->next;}
}
void main%&
+int i
clrscr%&
cout((0cate elemente va avea lista20
cin>>n
for%i=3i(=ni44&
creare.lista%&
cout((endl((05lementele listei de la stanga la dreapta sunt:0((endl
listare.stanga.dreapta%&
creaza_lista_circulara();
cout$$endl$$&afiseaza lista circulara incepand de la primul '&$$endl;
afiseaza_lista_circulara(prim);
cout$$endl$$&afiseaza lista circulara incepand de la al doilea '&$$endl;
afiseaza_lista_circulara(prim->next);
cout$$endl$$&afiseaza lista circulara incepand de la ultimul '&$$endl;
afiseaza_lista_circulara(ultim);
getc)%&
-
#robleme propuse:
#roblema 3
6a se genereze o lista circulara care prelucreaza numere intregi:
a& sa se parcurga lista incepand de la primul nod in ambele sensuri
b& sa se parcurga lista incepand de la ultimul nod in ambele sensuri
c& sa se parcurga lista in ambele sensuri din doua in doua elemente de n ori
d& sa se parcurga n elemente pornind de la primul din p in p elemente. 7e exemplu, daca
lista contine valorile: 3,8,9,:,;,<,=,> si n=30 iar pasul este 9 atunci se va afisa:
3,:,=,8,;,>,9,<,3,:
#roblema 8
?n numar de n copii se gasesc in cerc urmand ca unul dintre ei sa iasa din cerc. * si cele n
nume se citesc din fisierul copii.in. In fisierul cantec.in este scris un cantecel despartit in
silabe. 7e la tastatura se citeste numele unui copil de la care se incepe @numaratoareaA. 6a
se determine numele copilului care iese din cerc.
5xemplu:
copii.in
;
adi
dan
cristi
ana
alexandru
cantec.in
a la ba la por to ca la
7aca se incepe de la dan iese ana.

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