Sunteți pe pagina 1din 7

Structuri dinamice de date

Structurile, la care relatiile de structura pot fi modificate in timpul executiei unui program s
se numesc structure dinamice de date.
Structurile, la care relatiile de structura nu pot fi modificate in timpul executiei unui program
se numesc structuri statice de date.

Ex de structurili statice: tabloul, articolul, multimile, fisierele.


Ex. de structuri dinamice: listele, stiva in forma de lista, coada in forma de lista, arborii-
ca structuri dinamice

Structuri dinamice de date:


Sunt mai multe structuri dinamice de date:
1. Liste:
 Liste unidirectionale in forma de coada (FIFO) – cu un camp referinta
 Liste unidirectionale in forma de stiva (LIFO) - cu un camp referinta
 Liste 2- directionale – cu doua campuri referinta
 Liste circulare – cand ultima celula din lista indica la I
2. Arborii : - arbori binari dinamici- ca strucrura recursiva de date
- arbori- ca structuri statice: Heap-ul, arborii de intervale, arborii indexati binar
- …
Liste unidirectiobale (simplu inlantuite) in forma de coada.
Pentru a crea o lista unidirectionala in forma de coada ne vom folosi de tipul de
date struct si tipul de date referinta. Vom declara urmatorul tip de date:
typedef struct celula
{ int nr;
celula *next; } *coada;
Pentru a crea o coada vom lua 3 variabile: coada p,v,r;
- p - va indica adresa la I celula din coada
- r – va fi variabila curenta cu care voi crea celule r= new celula;
- v – e variabila, carre vine din urma si face legaturi intre celule:
v->next=r; v=r (sau v->next=r; v=r)

Exista o adresa in HEAP, care se numeste NULL, unde informatie nu se


pastreaza, dar adresa NULL va indica sfarsitul listei. Celula va contine 2
campuri:
- un camp pentru a pastra informatia nr sau info
- un camp referinta, pentru a face legatura intre celule - next
Ilustrarea grafica a unei liste in forma de coada (queue).
Ex, de citit 5 numere: 4 5 9 8 7 si de creat o coada.
Coada:

Algoritmul de creare a celulelor se deosebeste numai dupa I celula.


Crearea cozii:
1. Dupa ce cream I celul si p==NULL atunci p=r; v=r;
2. Daca cream celulele incepand cu a doilea, atunci v->next=r; v=r;
Deaceea vom face o instructiune if si crearea celuleor o va face o instructine
ciclica Adica:
cout<<"Citeste cate numere vor fi in coada"<<endl;
cout<<"n="; cin>>n; p=NULL;
for(i=1;i<=n;++i) { r=new celula; cin>>(*r).nr;
r->next=NULL;
if (p==NULL) { p=r; v=r; }
else { v->next=r; v=r; }
}
Algoritmul de scriere a informatiei din coada, dupa principiu FIFO
cout<<"Am creat urmatoare lista"<<endl;
r=p;
while (r) { cout<<r->nr<<” ”; r=r->next;}
Pentru a parcurge lista si a afla suma nr, , nr maxim, nr. minim, nr. cu o anumita
proprietate, iarasi parcurgem lista:
int maxi=p->nr, mini=p->nr, s=0; r=p;
while (r) { if (r->nr<mini) mini=r->nr
if (r->nr>maxi) maxi=r->nr;
s+=r->nr;
r=r->next;
}
II metoda
int maxi=p->nr, mini=p->nr, s=0;
for(r=p; r; r=r->next )
{ if (r->nr<mini) mini=r->nr;
if (r->nr>maxi) maxi=r->nr;
s+=r->nr;
}

Sortarea informatiei din lista:


Atentie: cand vom sorta nu vom distruge legaturile dintre celule. Vom compara
doar informatia din nr si daca vom schimba vom face swap (r->nr, v->nr);
v=p;
while (v->next != NULL)
{ r=v->next;
while (r) { if (r->nr< v->nr) swap (r->nr, v->nr) ;
r=r->next;
}
Cu for:
for (v=p; v->next !>NULL; v=v->next )
for (r=v->next; r ;r=r->next)
if (r->nr< v->nr) swap (r->nr, v->nr) ;

Prelucrarea listelor:
Putem face:
1. crearea listei
2. scrierea informatiei din lista
3. parcurge lista si prelucram informatia
4. sortam informatia din lista
5. stergem celule cu informatie din lista
6. inseram celule noi in lista

Creare listei in forma de stiva (LIFO)

Avem nevoie doar de doua variabile p si r;


p = NULL;
cin>>n;
for (i=1 ; i<=n; i++)
{ r= new celula;
cin>>r->nr;
r->next= p;
p=r;
}
Ex. citim 6 numere: 5, 6, 9, 2, 3, 4 si cream o lista in forma de stiva:
Stiva:

Parcurgerea, cautare, sortarea informatiei din stiva e dupa acelasi algoritm


Prelucrarea listelor.

Algoritmi de prelucrare a datelor din lista


1. Parcurgerea listei si cautarea datelor cu o anumita proprietate
2. Sortarea datelor din lista(fie in ordine crescatoare, sau descrescatoare)
3. Stergerea datelor din lista
4. Inserarea datelor in lista

Stergerea datelor din lista:

1. la stergere vom avea nevoie de variabilele lista p,r,v;


2. La stergere trebuie sa precautam 3 cazuri:
a) stergerea I celule din lista (se muta variabila p)
b) stergerea ultimului element din lista (se muta sfarsitul listei NULL)
c) stergerea unei celule din mijloc
Problema: De sters din lista toate numerele pare
Sunt posibile trei cazuri:
a) stergem primul element din lista
b) stergem ultimul element din lista
c) stergem un element din mijloc

A sters toate celulele din lista si lista e vida


Stergerea din lista in forma de coada in C++
#include <bits/stdc++.h> // vom sterge din lista numerele pare
using namespace std;
typedef struct celula { int nr;
celula *next;
} *lista;
lista v, r, p; bool u;
int x, maxi, mini, s, k;
ifstream fi("prob3.in");
ofstream fo("prob3.out");

int main()
{ p=NULL; u=false;
while(fi>>x) { r=new celula; r->nr=x; r->next=NULL;
if (p==NULL) { p=r; v=r; }
else { v->next=r; v=r; }
}
r=p; mini=p->nr; maxi=p->nr; s=0; k=0;
while(r) { if (r->nr%2==0){ u=true; s=s+r->nr; ++k; }
if (r->nr>maxi) maxi=r->nr;
if (r->nr<mini) mini=r->nr;
fo<<r->nr<<" ";
r=r->next;
}
fo<<endl;
fo<<"minimul este="<<mini<<"\n"; fo<<"maximul este="<<maxi<<"\n";
if (u==false) fo<<"nu sunt elemente pare, lista nu se modifica"<<"\n";
else { fo<<"suma el. pare este="<<s<<"\n"; fo<<"media el.
pare="<<(float)s/k<<"\n";
r=p; v=p; // stergem numerele pare
while(r) { if (r->nr %2 ) {v=r;r=r->next;}
else if (r==p){ p=r->next; delete r; v=p; r=p;}
else if (r->next==NULL)
{ v->next=NULL; delete r; r=NULL; }
else { v->next=r->next; delete r; r=v->next; }
}
if (p==NULL) fo<<"lista e vida"<<"\n";
else for(r=p; r ; r=r->next) fo<<r->nr<<" ";
fo<<"\n";
}
return 0;
}

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