Documente Academic
Documente Profesional
Documente Cultură
Ministerul Educaţiei Şi Cercetării
Ministerul Educaţiei Şi Cercetării
PROFESOR NDRUMTOR:
BIBICU DORIN
NUME:
Moraru Florin
CLASA A XII-A D
Pagina 1
CUPRINS
INTRODUCERE N LISTE............................................................................................................4
LISTE CIRCULARE.......................................................................................................................7
Introducere...................................................................................................................................7
Clasificarea listelor circulare.......................................................................................................8
Operaii n liste circulare............................................................................................................11
APLICAII....................................................................................................................................14
Reinei coordonatele unui poligon i calculai perimetrul acestuia..........................................14
Concatenarea a dou liste circulare............................................................................................16
Se citesc mai multe numere memorate ntr-o list circular.Sfritul listei este marcat prin
citirea unei valori egal cu suma ultimelor dou numere introduse.S se realizeze un
subprogram recursiv pentru afiarea elementelor n ordinea invers introducerii.....................19
BIBLIOGRAFIE............................................................................................................................23
Pagina 2
Pagina 3
INTRODUCERE N LISTE
Lista este o structur de date logic, liniar, cu date omogene, n care fiecare element are
un succesor i un predecesor, exceptnd primul element, care nu are dect un succesor, i ultimul
element, care nu are dect predecesor.
a1
a2
ai-1
ai
ai+1
an
Unde:
a1 este primul element ( nu are predecesor );
ai este elementul care l are ca succesor pe ai+1 i ca predecesor pe ai-1;
an este ultimul element ( nu are succesor );
Operaiile care se pot executa asupra listelor sunt:
n funcie de modul n care se aloc memoria intern, listele pot fi implementate prin
dou metode:
metoda static: folosind vectori;
metoda dinamic: folosind pointeri;
n funcie de modul n care sunt aranjate elementele n list, acestea pot fi implementate
prin:
metoda secvenial;
metoda nlnuit;
n implementarea prin alocare secvenial nodurile listei sunt stocate ntr-un bloc
contiguu de locaii de memorie cu adrese consecutive.De exemplu, dac avem o list
format din cuvinte de maximum 4 caractere, acestea vor fi scrise ntr-un bloc contiguu
Pagina 4
n implementarea prin alocare nlnuit nodurile listei nu mai sunt stocate succesiv
n memorie.Aceast implementare se poate face att static, ct i dinamic, ntre cele dou
implementri existnd urmtoarele diferene:
n implementarea static, nodurile listei ocup un bloc contiguu de locaii de memorie
( zona de memorie alocat vectorului );
n implementarea dinamic, nodurile listei ocup locaii dispersate din memorie ( a cror
adres poate fi pstrat cu ajutorul pointerilor );
Clasificarea listelor:
Listele liniare se clasific n:
Liste generale
Stiva
Lista simplu
Lista dublu
Operaiile de
nlnuit:
introducere i extragere nlnuit:
Coada
Lista circular:
Operaia de introducere
Pagina
5
a elementelor
se face
Este o list
nlnuit
n
a elementelor se pot
pe la o extremitate,
iar ultim se
care elementul
Fiecare element
Fiecare element
face numai printr-una
extragerea prin
leagacealalta
de cel prim
pstreaz legtura cu
pstreaz
legtura cu
Liste
restrictive
din extremiti
extremitate
LISTE CIRCULARE
Introducere
O list circular simplu nlntuit este o list liniar simplu nlntuit modificat astfel
nct ultimul element pointeaz ( direcioneaz ) spre primul element din list.
Pagina 6
O list circular dublu nlntuit este o list liniar dublu nlntuit modificat astfel
nct ultimele elemente pointeaz respectiv spre primele elemente din list.
n continuare ne vom referi la liste circulare simplu nlntuite pe care le vom numi simplu:
liste circulare.
Deci fiecare element din lista circular are urmtoarea structur:
a1
a2
ai-1
ai
ai+1
an
a1
struct nume_structura {
nume_tip1 nume_var1;
//...................
nume_tipN nume_varN;
nume_structura *nume_pointer; // pointer de tip nume_structura care va indica spre urmatorul
element };
struct record
{
int number;
record *next;
Pagina 7
};
La listele circulare, pe baza informatiei de nlntuire trebuie s poat fi identificat
urmtorul element din list.
Dac implementarea structurii de list circular se face prin tablouri, o list circular este
numit list circular alocat static sau simplu o list circular static.
Considerm urmtoarele declaratii:
struct element {
char* data;
int leg;
};
element v[8];
v[1
]
v[2
]
v[3
]
v[4
]
v[6
]
v[7
]
v[1
]
reprezint pentru fiecare element al vectorului legtura catre urmtorul element , iar
pentru ca lista s fie circular de la ultimul element se face legatura catre primul.
Pagina 8
Observaie: Nu mai exist un ultim element n list ca la listele liniare! Este necesar s
cunoastem care este primul element din nlntuire, pentru aceasta retinem ntr-o variabil:
int cap;
Indexul primului element
cap=3;
while (V[crt].leg!=cap) {
crt = V[crt].leg;
Prelucreaza V[crt]
}
}
Dac implementarea structurii de list circular se face prin tehnici de alocare dinamic
se obtine o list circular alocat dinamic sau simplu o list circular dinamic.
Considerm urmtoarele declaraii:
struct Element
Pagina 9
{
TipOarecare data; // informatia util
Element* leg; // legtura
};
Avnd declaratiile de mai sus (una din forme):
Element* p; // un pointer la Element
n urma unei operatii:
p = (Element*) malloc( sizeof(Element) )
Pagina 10
p = cap;
while (p->leg!=cap && !conditie(p->leg))
p = p->leg;
Bucla while se poate opri pe condiia "p->leg==cap", ceea ce nsemn c nici un element
din list nu ndeplineste conditia iar pointerul p indic ultimul element din list, sau pe conditia
"conditie(p->leg)" , ceea ce nsemn c pointerul p va contine adresa elementului din fata
primului element care ndeplineste condiia.
Inserarea unui nod n list:
q = ptr_nod;
do
{
q1 = q; q = q -> urm;
if (q -> cheie == key ) break;
Pagina 12
}
while (q! = ptr_nod);
if (q-> cheie == key)
{
if (q==q -> urm) ptr_nod==0;
else
{
q1 -> urm = q -> urm;
if (q == ptr_nod) ptr_nod = q1;
}
elib_nod(q);
}
tergerea listei:
p = ptr_nod;
do
{
p1 =p; p = p -> urm;
elib_nod(p1);
}
while (p! = ptr_nod);
ptr_nod = 0;
APLICAII
Reinei coordonatele unui poligon i
calculai perimetrul acestuia
#include<stdio.h>
Pagina 13
#include<conio.h>
#include<alloc.h>
#include<math.h>
struct nod
{ int x,y;
struct nod *next;
}*l,*q;
int n,i;
float p;
struct nod* creare()
{ struct nod* aux;int x,y;
l=NULL;
for(i=n;i>=1;i--)
{ aux= (struct nod* )malloc(sizeof(struct nod));
printf("coordonatele vfului %d",i);
printf("x=" );
scanf("%d",&x);
printf("y=" );
scanf("%d",&y);
aux->x=x;
aux->y=y;
aux->next=l;
if (i==n) q=aux;
l=aux;
}
q->next=l;
return l;
}
void afisare()
{ struct nod* c;
c=l;
Pagina 14
printf("(%d,%d)",c->x,c->y);
c=l->next;
while(c!=l)
{ printf("(%d,%d)",c->x,c->y);
c=c->next;
}
}
void perimetru()
{ struct nod*c;
c=l;
p=0;
for(i=1;i<=n;i++)
{ p+=pow(pow(c->x-c->next->x,2)+pow(c->y-c->next->y,2),0.5);
c=c->next;
}
}
void main(void)
{ clrscr();
printf("nr de varfuri este " );
scanf("%d",&n);
l=creare();
afisare();
perimetru();
printf("p=%f",p);
getch();
}
Pagina 15
l=aux;
}
u->next=l;
if(k==0) u=ultim;
else u1=ultim;
return l;
}
void afisare(struct nod*l)
{ struct nod*c;
c=l;
printf("\n" );
printf("%d ",l->x);
c=l->next;
while (c!=l)
{
printf("%d ",c->x);
c=c->next;
}
}
struct nod* concat(struct nod* l,struct nod* l1)
{ struct nod* c,*aux;
u->next=l1;
u1->next=l;
return l;
}
Pagina 17
void main()
{ clrscr();
l=creare(l,0);
afisare(l);
l1=creare(l1,1);
afisare(l1);
printf("\nListele concatenate\n" );
l=concat(l,l1);
afisare(l);
getch();
}
#include <alloc.h>
struct nod
{ int x;
struct nod *next;
}*l,*q,*linv,*qinv;
int i,n,start,stop;
struct nod* insert(int x){
struct nod*aux;
aux= (struct nod*) malloc (sizeof(struct nod));
aux->x=x;
aux->next=l;
if (start) q=aux;
l=aux;
return l;
}
struct nod* creare()
{ int v1,v2,v3;
l=NULL;start=1;
printf("Info.= " );
scanf("%d",&v1);
l=insert(v1);
start=0;
stop=0;
printf("Info.= ") ;
scanf("%d",&v2);
Pagina 19
l=insert(v2);
printf("Info.= " );
scanf("%d",&v3);
while(stop==0){
if(v3==v1+v2) stop=1;
l=insert(v3);
v1=v2;
v2=v3;
printf("Info.= " );
scanf("%d",&v3);
}
q->next=l;
return l;
}
void afisare(struct nod*l)
{ struct nod*c;
c=l;
printf("%d ",c->x);
c=l->next;
while (c!=l)
{ printf("%d ",c->x);
c=c->next;
}
printf("\n" );
}
Pagina 20
0void main()
{ l=creare();
afisare(l);
linv=inversa(l);
afisare(linv);
getch();
}
Pagina 21
BIBLIOGRAFIE
http://www.cs.uregina.ca/Dept/manuals/Manuals/7Language/7_18C++/c++.htm
file://localhost/D:/download/Liste%20dublu%20inlantuite,%20liste%20circulare.htm
http://www.skullbox.info/board/-curs-c-lectia-12-liste-p31092.html
Pagina 22
http://cppcorner.3x.ro/circularlist.html
Pagina 23