Sunteți pe pagina 1din 33

1

Limbaje evoluate de
programare

11/4/2013 4:59 PM

Structuri
dinamice de date

11/4/2013 4:59 PM

Masive de date

Sunt colecii de date omogene stocate ntr-o


zon continu de memorie.
Pot fi alocate static (la compilare) sau dinamic (la
execuie).
Dezavantajul utilizrii masivelor:

n alocarea static se aloc mai multe elemente


dect este nevoie
n alocarea dinamic redimensionarea masivului
necesit dezalocare i realocare

Structuri dinamice de date

Reprezint o alternativ de stocare a coleciilor


de date omogene.
Nu necesit o zon continu de memorie i nici
cunoaterea numrului de elemente din colecie.
Sunt reprezentate sub forma unor colecii de
noduri, n care fiecare nod conine pe lng
informaia propriu-zis i adresele altor noduri
Adugarea sau tergerea nodurilor se realizeaz
la execuie, prin urmare sunt mulimi dinamice

Structuri dinamice de date

Dezavantaje:

Avantaje:

consumul sporit de memorie


efort mai mare de calcul n cazul accesului la un nod
o mai bun gestionare a memoriei

Categorii de structuri dinamice:

liste liniare (simplu / dublu nlnuite, circulare etc)


arbori
grafuri

Liste liniare

Tipuri de liste:

liste liniare simplu nlnuite

liste liniare dublu nlnuite

liste circulare

Liste liniare

11/4/2013 5:00 PM

Liste liniare

Implementarea unui nod (C++):


struct Nod {
// declaratii campuri
Nod *urm; // adresa nodului urmator
};

Gestionarea listei:

printr-un pointer ce pstreaz adresa primului


element din list (a capului listei)
Nod *cap;

pentru prelucrri la sfritul listei se poate folosi


un pointer suplimentar ctre ultimul nod
Nod *ultim;

Stiva

O list simplu nlnuit n care adugrile i


tergerile se fac pe la un singur capt al listei,
vrful su (LIFO - Last In First Out)

10

Stiva

Operaii fundamentale pe stive:

adugare n vrful stivei


eliminare din vrful stivei
tergere stiv
verificare dac stiva este vid
verificare dac stiva este plin (dac exist o
limit superioar)
parcurgerea stivei

11

Stiva

adugare a unui nod n vrful stivei:


void Push(Nod*&cap, int info){
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=cap;
cap=nou;
}

tergere a nodului din vrful stivei:

11

12

Stiva

tergerea stivei:
void StergereStiva(Nod*&cap){
while (cap!=NULL){
Nod *sters=cap;
cap=cap->urm;
delete sters;
}
cap=NULL;
}

verificare stiv vid:


int StivaVida(Nod *cap){
return cap==NULL;
}

12

13

Stiva

verificare stiv plin:


int StivaPlina(Nod *cap, int limsup){
int nr=0;
while (cap!=NULL){
nr++; cap=cap->urm;
}
return nr>=limsup;
}

parcurgere stiv:
void Parcurgere(Nod *cap){
while (cap!=NULL){
cout<<cap->cheie<<" ";
cap=cap->urm;
}
cout<<endl;
}

13

14

14

Coada

List simplu nlnuit n care tergerile se fac la


un capt (vrful cozii), iar adugrile la cellalt
capt (sfritul cozii) (FIFO - First In First Out)

15

15

Coada

Operaii fundamentale pe cozi:


adugare la sfritul cozii
eliminare de la nceputul cozii
tergere coad
verificare dac coada este vid
verificare dac coada este plin
parcurgerea cozii
Gestiunea cozii se face de obicei prin doi pointeri ce
conin adresele primului nod (capul cozii) i a
ultimului nod (sfritul cozii)

16

Coada

adugare a unui nod la sfritul cozii:


void Push(Nod*&cap, Nod*&ultim, int info){
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=NULL;
if (cap==NULL)
cap=ultim=nou;
else {
ultim->urm=nou;
ultim=nou;
}
}

16

17

Coada

tergere a nodului de la nceputul cozii:


void Pop(Nod*&cap){
if (cap==NULL) { cout<<"Coada vida\n"; return; }
cout<<"Sterge din coada "<<cap->cheie<<endl;
Nod *sters=cap;
cap=cap->urm;
delete sters;
}

tergerea cozii:
void StergereCoada(Nod*&cap, Nod*&ultim){
while (cap!=NULL){
Nod *sters=cap;
cap=cap->urm;
delete sters;
}
cap=ultim=NULL;
}

17

18

18

Liste simplu nlnuite

Operaii pe liste simplu nlnuite:

crearea listei
adugarea unui nod
accesarea unui nod (cutare,
extragere informaie etc.)
parcurgerea listei
tergerea unui nod
tergerea listei

modificare,

19

19

Liste simplu nlnuite

Crearea listei - se face prin adugarea de noduri


la o list iniial vid, deci se ncepe cu un pointer
cap nul (cap=NULL).

Adugarea unui nod:


adugare la nceputul listei
void AdaugareInceput(Nod*&cap, int info) {
// adaugarea unui nou nod la inceputul listei
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=cap;
cap=nou;
}

20

Liste simplu nlnuite

adugare la sfritul listei


void AdaugareSfarsit(Nod*&cap, int info) {
// adaugarea unui nou nod la sfarsitul listei
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=NULL;
if (cap==NULL) { cap=nou; return; }
Nod *temp=cap;
while (temp->urm!=NULL)
temp=temp->urm;
temp->urm=nou;
}

20

21

21

Liste simplu nlnuite

adugare dup un nod dat


void AdaugareDupaNod(Nod*&cap, int info, int chnod){
// inserarea unui nod nou dupa un nod dat prin cheia sa
Nod *temp=cap;
while (temp!=NULL && temp->cheie!=chnod)
temp=temp->urm;
if (temp==NULL) {
cout<<"Nodul nu a fost gasit\n";
return;
}
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=temp->urm;
temp->urm=nou;
}

22

Liste simplu nlnuite

adugare naintea unui nod dat

void AdaugareInainteNod(Nod*&cap, int info, int chnod){


// inserarea unui nod nou inaintea unui nod dat prin cheia sa
if (cap==NULL) { cout<<"Nodul nu a fost gasit\n"; return; }
if (cap->cheie==chnod){
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=cap;
cap=nou;
}
else {
Nod *temp=cap;
while (temp->urm!=NULL && temp->urm->cheie!=chnod)
temp=temp->urm;
if (temp->urm==NULL) { cout<<"Nodul nu a fost gasit\n"; return; }
Nod *nou=new Nod;
nou->cheie=info;
nou->urm=temp->urm;
temp->urm=nou;
}
}

23

Liste simplu nlnuite

adugare n lista sortat

void AdaugareSort(Nod*&cap, int info){


// inserarea unui nod pe pozitia corespunzatoare intr-o
Nod *nou=new Nod;
nou->cheie=info;
if (cap==NULL || info<cap->cheie){
nou->urm=cap;
cap=nou;
return;
}
Nod *temp=cap;
while (temp->urm!=NULL && info>temp->urm->cheie)
temp=temp->urm;
nou->urm=temp->urm;
temp->urm=nou;
}

24

Liste simplu nlnuite

Parcurgerea listei:
parcurgere iterativ
void Parcurgere(Nod *cap){
// afisarea nodurilor listei
while (cap!=NULL){
cout<<cap->cheie<<" ";
cap=cap->urm;
}
cout<<endl;
}

24

25

Liste simplu nlnuite

parcurgere recursiv
void ParcurgereRec(Nod *cap){
// afisarea recursiva a listei
if (cap!=NULL){
cout<<cap->cheie<<" ";
ParcurgereRec(cap->urm);
}
else cout<<endl;
}

parcurgere recursiv invers


void ParcurgereInversa(Nod *cap){
// afisarea recursiva a listei in ordine inversa
if (cap!=NULL){
ParcurgereInversa(cap->urm);
cout<<cap->cheie<<" ";
}
}

25

26

Liste simplu nlnuite

Modificarea cheii unui nod:


void ModificareNod(Nod *cap, int info, int chnod){
// modica primul nod cu cheia data
Nod *temp=cap;
while (temp!=NULL && temp->cheie!=chnod)
temp=temp->urm;
if (temp==NULL) {
cout<<"Nodul nu a fost gasit\n";
return;
}
temp->cheie=info;
}

Verificare list vid:

int ListaVida(Nod *cap){


// verificarea daca lista este vida
return cap==NULL;
}

26

27

Liste simplu nlnuite

tergerea unui nod:


tergerea primului nod al listei
void StergereInceput(Nod*&cap) {
// stergerea primului nod al listei
if (cap==NULL) { cout<<"Lista vida\n"; return; }
else {
Nod *sters=cap;
cap=cap->urm;
delete sters;
}
}

27

28

Liste simplu nlnuite

tergerea ultimului nod al listei


void StergereSfarsit(Nod*&cap) {
// stergerea ultimului nod al listei
if (cap==NULL) { cout<<"Lista vida\n"; return; }
else if (cap->urm==NULL){
delete cap;
cap=NULL;
}
else {
Nod *temp=cap, *sters;
while (temp->urm->urm!=NULL)
temp=temp->urm;
sters=temp->urm;
temp->urm=NULL;
delete sters;
}
}

28

29

29

Liste simplu nlnuite

tergerea unui nod dup cheie

void StergereNod(Nod*&cap, int chnod){


// sterge primul nod cu cheia data
if (cap==NULL) { cout<<"Nodul nu a fost gasit\n"; return; }
if (cap->cheie==chnod){
Nod *sters=cap;
cap=cap->urm;
delete sters;
}
else {
Nod *temp=cap, *sters;
while (temp->urm!=NULL && temp->urm->cheie!=chnod)
temp=temp->urm;
if (temp->urm==NULL) { cout<<"Nodul nu a fost gasit\n"; return; }
sters=temp->urm;
temp->urm=temp->urm->urm;
delete sters;
}
}

30

Liste simplu nlnuite

tergerea tuturor nodurilor cu o anumit cheie


void StergereNodRec(Nod*&cap, int chnod){
// sterge toate nodurile cu cheia data
if (cap!=NULL)
if (cap->cheie==chnod){
Nod *sters=cap;
cap=cap->urm;
delete sters;
StergereNodRec(cap,chnod);
}
else
StergereNodRec(cap->urm,chnod);
}

30

31

Liste simplu nlnuite

tergerea listei:
void StergereLista(Nod*&cap){
// stergerea tuturor nodurilor listei
while (cap!=NULL){
Nod *sters=cap;
cap=cap->urm;
delete sters;
}
cap=NULL;
}

31

32

Liste simplu nlnuite

Sortarea listei
void SortareLista(Nod*&cap) {
// creeaza o lista noua sortata
Nod *sortat=NULL, *temp=cap;
while (temp!=NULL){
AdaugareSort(sortat,temp->cheie);
StergereNod(temp,temp->cheie);
}
cap=sortat;
}

32

33

END

33

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