Sunteți pe pagina 1din 19

CRITERII DE CLASIFICARE A DATELOR

Alocarea memoriei interne

Structuri statice Structuri dinamice


Dimensiunea zonei alocate este fixa. Alocarea ei Dimensiunea zonei alocate nu este
se face in timpul compilarii , in functie de fixa. Alocarea sau eliberarea
modul in care a fost declarata stuctura, iar in zonelor de memorie folosita de
timpul executiei programului nu mai poate fi structura se face in timpul
modificata executiei programului , in functie
de numarul de componente ale
structurii
Implementarea in limbajul de
programare

Structuri implicite Structuri explicite


Structura creata la nivel conceptual este Structura creata la nivel conceptual nu
implementata la nivelul limbajului de este implementata la nivelul
programare. Reprezentarea sa este implicita si nu limbajului de programare.
mai necesita informatii suplimentare pentru Reprezentarea se va face folosind
localizarea componentelor structurile implicite implementate,
in limbaj, fiind necesare informatii
suplimentare pentru localizarea
componentelor
Dispunerea elementelor in memorie

Structuri contigue Structuri dispersate


Elementele sunt dispuse in zone contigue de memorie, Elementele sunt dispuse in zone
care permie localizarea uneia dintre ele folosind o dispersate de memorie, pentru a
adresa de referinta si deplasarea fata de adresa de putea localiza elementele in
referinta structura, trebuie sa se memoreze
pentru fiecare element si adresa la
care se gaseste
Dezavantaje structuri statice: deoarece alocarea zonei de memorie se face la
compilarea programului, iar in timpul executiei programului pot sa apara
urmatoarele cazuri:

- spatiul alocat structurii este insuficient


- spatiul alocat structurii este mult mai mare decat necesar

Avantaje structurii dinamice:alocarea memoriei se face in timpul executiei


programului, in functie de numarul de componente ale structurii la acel moment,
iar acesta poate fi dezafectat la cererea utilizatorului
STUDIU DE CAZ
Scop: identificarea modului in care trebuie sa identificati problemele in
care puteti folosi structura de date de tip lista pentru a le rezolva

 Intr-o biblioteca, exista o colectie de carti organizate in ordinea alfabetica a


autorilor.Un cititor poate imprumuta o carte(se extrage din colectie)sau poate
inapoia o carte ( se insereaza in colectie).Toate aceste operatii trebuie executate
astfel incat sa se pastreze organizarea in ordine alfabetica a autorilor.
 La o benzinarie s-a format o coada de asteptare.Masinile sunt servite in ordinea
venirii.Prima masina sosita este prima servita, iar ultima masina venita se aseaza la
coada.Toate aceste operatii trebuie executate astfel incat sa se pastreze ordinea in
care au sosit masinile si s-au asezat la coada
 Intr-o stiva de carti, volumele sunt asezate in ordine alfabetica a titlurilor.Trebuie
extrasa din stiva o carte fara a deranja modul in care sunt ordonate cartile in stiva
La nivel conceptual, toate aceste colectii de date reprezinta un sir de date de acelasi tip,
care trebuie prelucrate prin inserarea si extragerea de elemente, pastrandu-se o
anumita ordine de aranjare a elementelor. Daca la nivel logic s-ar alege solutia
de a grupa aceste elemente intr-o structura de date de tip vector, algoritmii de
prelucrare, vor necesita multe deplasari de elemente care consuma timp de prelucrare
In cazul structurilor care trebuie sa-si pastreze in timpul exploatarii ordonarea dupa un
anumit criteriu, mecanismul vectorilor este greoi.In aceste cazuri, se poate alege ca
solutie de implementare a structurii de date lista, care nu este o structura fizica de
organizare a datelor, ci o structura logica, ce degreveaza programatorul de
ordonarea dupa indice a structurii, impusa de vectori.

Definitia structurii de date de tip lista


Lista= este o structura de date logica, liniara, cu date omogene, in care fiecare
element are un succesor si un predecesor, exceptand primul element, care nu
are decat succesor si ultimul element care nu are decat predecor
Considerăm un nod al listei simplu înlănţuite de forma
Adresa
Informatia utila
elem.urm.

Secventa de instructiuni Pascal


pentru definirea unui nod al listei
Secventa de instructiuni C++ pentru
definirea unui nod al listei
Type pointer= ^nod
nod= record Struct nod
info:tip;
{ tip_data info
urm:pointer;
nod* urm}
end;
Var prim:pointer; Nod* prim

Vom utiliza urmatoarele notatii:


PRIM – pointerul primului nod al listei,
ULT - ultimul nod al listei
TEMP –pointer temporar de lucru
Lista simplu inlantuita La={(di,si)|diD,si P}

dn d n-1 … d2 d1

C
B

Lista dublu inlantuita Ls={(pi,di,si)|diD,pi,si P}


C B

dn d n-1 … d2 d1
LISTE PARTICULARE
Stiva (lista LIFO)

inserare
citire dn dn-1 … d2 d1
ştergere

Operatii pe stiva: inserare in capul stivei, stergere din


capul stivei, citirea din capul stivei.

Coada (lista FIFO)

ŢĂ
FA SPATE
citire dn d n-1 … d2 d1 inserare
ştergere
S
F

Operatii specifice: inserare in spate, stergere din fata


cozii, citirea din fata cozii.
Inserare în faţa listei
 Considerăm o listă simplu înlănţuită în care primul
element al listei este recunoscut prin vb. pointer PRIM
iar ultimul element al listei ULT

PRIM ULT

Inf.utilă urm Inf.utilă urm Inf.utilă nil

temp

Inf.utilă urm

Pascal C++
New(temp); temp=new(nod);
read(x); cin>> x
temp^.inf:=x; temp->info=x;
temp^.urm:=prim; temp->urm:=prim;
prim:=temp; prim:=temp;
INSERARE IN SPATELE LISTEI

Prim Ultim

5 7 10 NIL NIL

Q
Pascal
New(Q); C++ 9
x:=9; q=new(nod);
q^.inf:=x; x=9;
q^.urm:=NIL; q->info=x;
ultim^.urm:=q; q->urm:=NULL;
ultim:=q ultim->urm=q
ultim:=q;
INSERARE DUPA UN NOD (M)

Prim m Ultim

5 7 10 NIL
9

Pascal 9
C++
New(p); p=new(nod);
x:=9; x=9;
p^.inf:=x; p->info=x;
p^.urm:=m^.urm; p->urm:=m->urm;
m^.urm:=p m->=urm=p;
STERGEREA PRIMULUI NOD

Prim temp Prim Ultim

5 9 7 10 NIL

Pascal
C++
temp:=prim temp=prim
prim:=prim^.urm prim:=prim->urm
dispose(temp) delete (temp)
STERGEREA ultimului NOD al listei

P ultim
Prim ultim

5 9 7 NIL 10 NIL

Pascal
C++
temp:=ultim temp=ultim
p^.urm:=nil; p->urm=NULL;
dispose(temp) delete(temp)
ultim:=p ultim:=p
ant info urm
INSERARE IN FATA LISTEI
DUBLU INLANTUITE

Prim Ultim

NIL 2 8 7 NIL

Pascal
New(P); C++
P p=new(nod);
x:=6;
p^.inf:=x; x=6;
NIL 6 p^.urm:=prim; p->inf=x;
p^.ant:=nil; p->urm=prim;
prim^.ant:=p; p->ant=NULL;
prim:=p prim->ant=p;
prim=p
ant info urm
INSERARE IN SPATELE LISTEI
DUBLU INLANTUITE

Prim Ultim

NIL 2 8 7 NIL NIL

Pascal
New(P); C++
p=new(nod); P
x:=6;
p^.inf:=x; x=6;
p^.urm:=NIL; p->inf=x; 6
p^.ant:=ULTIM; p->urm=NULL;
ultim^.urm:=p p->ant=ultim;
ultim:=p ultim->urm=p
ultim=p
ant info urm
INSERARE DUPA UN NOD
OARECARE (dupa primul nod)/
LISTA DUBLU INLANTUITA

Prim P Ultim

NIL 2 8 7 NIL

Q
C++
Pascal p=new(nod);
6 x:=6;
New(q);
x:=6; q->inf=x;
q^.inf:=x; q->urm=prim->urm;
q^.urm:=prim^.urm; q->ant=prim->urm;
q^.ant:=prim^.urm; prim->urm->ant=q
prim^.urm^.ant:=q prim->urm=q
prim^.urm:=q
ant info urm STERGEREA UNUI NOD DIN INTERIORUL
LISTEI DUBLU INLANTUITE
(stergerea nodului P)
Prim P Ultim

NIL 2 8 6 7 NIL

Pascal
C++
temp=p
temp:=p
prim->urm=p->urm;
prim^.urm:=p^.urm;
p->urm->ant=p->ant;
p^.urm.^ant:=p^.ant;
dispose(temp) delete(temp)
APLICAŢII ALOCARE DINAM
ICĂ

 Cuvinte ordonate
 Inmultirea a 2 numere mari
 suma a 2 polinoame
 Inmultirea a 2 polinoame
 Schimbarea sensului sagetilor într-o listă
 stergerea elementelor nule

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