Sunteți pe pagina 1din 38

STRUCTURI DE DATE

1. Structuri de date fundamentale


2. Clasificarea structurilor de date
3. Tipul de Date Abstracte

Structuri de date
Domeniul Structurilor de Date (SD) se ocup cu
stocarea i accesarea datelor.
Unul din argumentele pentru studiul structurilor de date
este acela c alegerea unei structuri nepotrivite de date poate
influena negativ eficiena unor algoritmi, sau c alegerea unei
structuri adecvate poate reduce memoria ocupat si timpul de
executie a unor aplicatii care folosesc intens colectii de date.
SD reprezint modaliti n care datele sunt dispuse n
memoria calculatorului sau sunt pstrate pe hard disc i sunt
utilizate n diferite circumstane ca de exemplu:
Memorarea unor date din realitate;
Instrumente ale programatorilor;
Modelarea unor situaii din lumea real.

Structuri de date
O structura de date (SD) este o celectie din mai multe
date elementare de tipuri diferite (sau uneori de acelai tip),
grupate cu un anumit scop i dup anumite reguli.
Dup definiia lui D.Knuth, SD prezint o modalitate
(metod) de a reprezenta datele n cadrul unui program.
Componentele unei structuri de date pot fi identificate prin
nume sau prin ordinea pe care o ocup n cadrul structurii.
Structurile de date pot fi create pentru a fi depozitate n
memoria intern (tablouri, struct, union, liste, etc.) i n
memoria extern (fiiere).

Structuri de date
O SD putem s considerm din dou puncte de vedere:
Logic ( elementele ei i legaturile dintre ele)
Fizic, ca mod de memorare (statice, semistatice i
dinamice)
O SD logic tot ar putea fi implementat att ca structura
static, semistatic sau dinamic.
Alegerea unei SD corespunztoare rezolvrii unei
probleme este extrem de important !

Cele mai importante operaii asupra


structurei de date
Operaia de creare, care const n memorarea pe
suportul de memorie a structurii de date n forma
iniial
Operaia de consultare (accesul , prelucrarea
valorilor acestora)
Operaia de actualizare (adaugarea/eliminarea de
noi elemente, modificarea componentelor structurii)

STRUCTURI DE DATE FUNDAMENTALE


Prima structur de date folosit n Pascal i C a fost
structura de tablou, utilizat n operatiile de de ordonare a
colectiilor.Apoi au aparut si altele (articoli,uniuni,...)
Dintr-o perspectiv independent de limbajele de
programare se pot considera ca structuri de date fundamentale
vectorii, listele nlntuite i arborii, fiecare cu diferite
variante de implementare. Alte structuri de date se pot
reprezenta prin combinaii de vectori, liste nlntuite i arbori.
n acest curs vom studia structurile de date care pot fi
implementate i utilizate n C.

CLASIFICRI ALE STRUCTURILOR DE


DATE
O SD este caracterizat prin relatiile dintre elementele
coleciei i prin operaiile posibile cu aceast colecie i pote fi
clasificat dup criterii diferite.
Un criteriu de clasificare foloseste relatiile dintre elementele
colectiei:
Colectii liniare (secvente, liste), n care fiecare element are un
singur succesor si un singur predecesor;
Colectii arborescente (ierarhice), n care un element poate avea
mai multi succesori (fii), dar un singur predecesor (printe);
Colectii neliniare generale, n care relatiile dintre elemente au
forma unui graf general (un element poate avea mai multi
succesori si mai multi predecesori).

CLASIFICRI ALE STRUCTURILOR DE


DATE
Dup rolul pe care l au n aplicatii si dup operaiile
asociate colectiei, indiferent de reprezentarea n
memorie, folosind noiunea de tip abstract de date:
- Structuri de cutare (mulimi i dictionare abstracte);
- Structuri de pstrare temporar a datelor
( liste, stive, cozi s.a.)

CLASIFICRI ALE STRUCTURILOR de DATE


Dup modul de reprezentare a relaiilor dintre elementele
coleciei:
- Implicit, prin dispunerea lor n memorie
(vectori de valori, vectori de biti, heap);
- Explicit, prin adrese de legtur (pointeri).
Dup numrul de aplicaii n care se folosesc putem distinge
ntre:
- Structuri de date de uz general ;
- Structuri de date specializate pentru anumite
aplicatii (geometrice, cu imagini).

Cele mai importante operaii asupra


structurilor de date
Operaia de creare, care const n memorarea pe
suportul de memorie a structurii de date n forma
iniial
Operaia de consultare (accesul , prelucrarea
valorilor acestora)
Operaia de actualizare (adaugarea/eliminarea de
noi elemente, modificarea componentelor structurii)

Tipul abstract de date


Un TAD este o specificaie a unui set de date de anumit tip,
mpreun cu un set de operaii care pot fi executate cu aceste
date. Aceasta este o entitate matematic abstract, cu existena
independent (mulimi , valori complex, int...). Abstractizarea
const n concentrarea asupra esenialului, ignornd detaliile.
n Programare avem necesitatea n TAD deoarece nici un
limbaj de programare nu poate oferi toat varietatea de tipuri
de date necesar i utilizatorul pentru a-i dezvolta aplicaia
trebuie s cunoasc un mecanizm de creare a unor noi tipuri de
date. Dar aceasta poate aduce la la dispersarea acestor date n
program, creterea comlexitii i neclaritii, erori...

Tipul abstract de date


Un Tip Abstarct de Date (TAD) a fost definit de
Barbara Liskov in 1974 i este un tip de date cu
urmtoarele proprieti:
1. Specificarea obiectelor din domeniu este independent
de la reprezentarea lor;
2. Specificarea operaiilor este independent de la
implementarea lor.
TAD = >un model matematic + set de operaii asupra lui
. o structur de date + funcii care opereaz pe ea
. noiunea de clas din programarea orientat pe obiecte

Tipul abstract de date (TAD)


Structurarea programelor pe mai multe module (fiiere)
permite i simularea mecanismului de abstractizare i
ncapsulare a datelor utiliznd TAD.
Un TAD folosit n tr-un program se implementeaz printrun modul - o parte a programului izolat de restul
programului printr-o interfa bine definit. Modulul asigur
servicii (funcii,tipuri i structuri de date) Clienilor
( persoana,alt modul). Aceste tipuri i structuri de date pot fi
Tipuri de date implicite
Tipuri de date definite de utilizatori
(liste, stive,cozi, arbori si a.)

Ex. de Tipuri de date definite de utilizatori

Tipul abstract de date


Pentru implementarea TDA n C:
n fiierul antet cu extensia .h se declar minimum
necesar pentru a putea compila programul i
prototipurile funciilor care manipileaz tipul respectiv
n fiierul cu extensia .c sau .cpp se descriu codurile
funciilor definite n fiierul antet.
Pe lng modulele create, se va crea i un fiier care va fi
fiierul principal (funcia main)

Structuri de date definite de catre utilizatori


1. Structuri, declararea si initializarea
2. Accesarea membrilor unei structuri
3. Operaii asupra unei structuri
4. Pointeri la structuri
5. Structuri i funcii
6. Uniuni

Struct
Struct este un tip de date C/Cpp care ne permite
gruparea unor elemente eterogene. Este o colecie de una
sau mai multe variabile(cmpuri), grupate sub un singur
nume.
Printr-o declaraie struct se definete un nou tip de
date de ctre utilizator. Definire in C/Cpp:
struct [nume_structura]
{ tip nume_camp_1;
tip nume-camp_2;

} [lista_variabile_structura];

Structuri. Exemple de declarare


a) struct data_calendaristica
{ int zi;
char luna[8];
int an;
} data_nast, data_ang;
b) struct
{ int zi;
char luna[8];
int an;
} data_nast, data_ang;

Structuri. Exemple de declarare


c) struct data_calendaristica
{ int zi;
char luna[8];
int an;
};
data_calendaristica data_nast, data_ang, data_conc;
Declararea unor variabile de un tip structur se poate face fie
dup declararea tipului structur, fie simultan cu declararea
tipului structur.

Structuri
1. struct student
{ char nume[40]; int an; float medie; };
2.

struct time {int ora, min, sec;};

3. struct activ
{//structura activitate
char numeact[30]; // nume activitate
struct time start; // ora de incepere
struct time stop; // ora de terminare
} p, pers[100];

Observatii
Accesul la la campurile structurii prin nume folosind operatorul de
selecie a
membrilor unei structuri care este caracterul punct . :
variabil_structur . nume_membru
Ex. Pers[i]. numeact, time.ora, student.an, e.t.c.
Dac un cmp este la rndul lui o structur, atunci numele unui cmp
poate conine mai multe puncte ce separ numele variabilei i cmpurile
de care aparine (n ordine ierarhic)!
Exemplu:
struct activ a;
printf (%s ncepe la %d: %d i se termina la %d: %d \n,
a.numeact, a.start.ora, a.start.min, a.stop.ora, a.stop.min);

Structuri in structuri

//Structura

pentru un punct in plan, cu coordonate x si y.

struct punct { float x, y; };


//Struc. pentru un dreptunghi definit prin doua colturi opuse.

struct dreptunghi { struct punct p1, p2; };


int main() {
struct dreptunghi d;
printf("Coordonatele primului colt? ");
scanf("%f%f", &d.p1.x, &d.p1.y);
printf("Coordonatele celui de-al doilea colt? ");
scanf("%f%f", &d.p2.x, &d.p2.y);
//Afisam coordonatele citite.

printf("(%.2f, %.2f) - (%.2f, %.2f)\n",


d.p1.x, d.p1.y, d.p2.x, d.p2.y); return 0; }

Alte structuri cu cmpuri de tip pointer


struct persoana {
char* nume;
char* strada;
int numar;
int varsta;};
struct stud {
struct persoana st;
char* grupa;
int an;
} stud[100];

Declararea si initializarea variabilelor de tip


struct
Pentru simplificarea declaraiilor, putem asocia unei
structuri un nume de tip de date, de exemplu tipul Book :
struct Book
{ char author[40];
// autor, un ir de simboluri
char title[80];
// titlu, un ir de simboluri
int year;
// anul ediitiei, int
int pages;
// numarul de pagini, int };
// Declaram variabilele de tip Book
Book b, carti[1000], *pb;

Declararea si initializarea variabilelor de tip


struct

Initializarea variabilei b de tip Book poate fi eefectuata in


felul urmator:
Book b = {
M. Iliadi",
Nunta in cer",
1998 ,
154
};
Exemple:
strcpy ( b.author, M. Iliadi );
b.year = 1998;
gets(carti[5].title);

Declararea si initializarea variabilelor de tip


struct
Accesul la campurile structurii prin pointer:
variabil_structur - > nume_membru
Ex. Referinta la struct Book prin pointer
Book b;
Book *p;
p = &b;
strcpy ( p->author, M.Iliadi );
p->year = 1998;

Alte exemple
Sa presupunem ca a fost declarata o structura Student. n cazul
pointerilor la structuri, pentru acces la membri modalitatea mai
simpl i mai des folosit:
Student s, *stud;
stud=&s;
stud -> medie = 9.31;
Expresia stud->medie este perfect echivalent cu:
(*stud).medie = 9.31;

( Student *stud = (Student*)malloc(sizeof(Student));


(*stud).medie = 9.31; )

Observatii
In structuri diferite pot exista cmpuri cu acelai
nume, dar ntr-o aceeai structur numele de
cmpuri trebuie s fie diferite.
Definirea tipului structur (cu sau fr typedef)
se
face la nceputul fiierului surs care conine
funciile (naintea primei funcii)
Cmpurile unei variabile structur nu se pot folosi
dect dac numele cmpului este precedat de
numele variabilei structur din care face parte.
Nu pot spune zi ci d.zi !!

Structuri si functii
Fie sunt declarate o structura si dou variabile
typedef struct {char x[100];} STRING;
STRING s1, s2;
s1=s2; // Atunci e posibil copierea sirului prin atribuire
O funcie poate ntoarce ca rezultat o structur:
// functie ce intoarce o structura de tip COMPLEX
cmplx(double x, double y)
{ COMPLEX z; // struct COMPLEX definita anticipat
z.re=x; z.im=y;
return z;}

Structuri si functii
Functia poate se intoarca un pointer la o structur:

*cmplx(double x, double y)
{ COMPLEX z,
*pz = &z;
//functioneaza corect
pz->re=x; pz->im=y;
return pz;}
un membru al unei structuri:
double real (COMPLEX z)
{ return z.re;}

Structurile pot fi transferate functiilor ca parametri prin


valoare , prin referinta si prin adresa. De exemplu :
void Year2013( Book b )
{
b.year = 2013;
}
void main()
{ Book b;
Year2013 ( b );
//apelam la functie prin valoare
}

Apelul functiilor prin referinta este posibil numai in C++, in


acest caz in functie se lucreaza cu acelasi exemplar ca si in
main.
void Year2013( Book &b )
{ b.year = 2013; }
//utilizarea adresei unei structuri ca parametru
void Year2013 ( Book *b )
{ b->year = 2013; }
void main()
{ Book b;
Year2013 ( &b );
}

Utilizarea tipului de date struct


Un tip structur poate fi folosit n :
declararea de variabile structuri sau pointeri la structuri
declararea unor argumente formale de funcii (structuri sau
pointeri la structuri)
declararea unor funcii cu rezultat de tip structur
Operaiile posibile cu variabile de un tip
structur sunt:
aplicarea operatorilor & i sizeof
atribuirea ntre variabile de acelai tip structur
se folosete operatorul de atribuire =
transmiterea ca argument efectiv la apelarea unei funcii.
transmiterea ca rezultat al unei funcii, ntr-o instruciune
return.

#include <stdio.h>
struct Book {//declaram un nou tip de date
char author[40];
char title[80];
int year;
int pages; };
void main()
{ Book b[100]; // declaram un tablou din inregistrari
int i, n;
FILE *fp; // pointer la fisier
fp = fopen("books", "rb"); //deschidem fisierul ptru citire
n = fread( &b[0], sizeof(Book), 100, fp);//citim o 100 de struct
fclose ( fp );
for ( i = 0; i < n; i ++ )
b[i].year = 2013; // schimbam anul de editare
fp = fopen("books", "wb"); deschidem fis. ptru scriere
fwrite ( b, sizeof(Book), n, fp);//schimbam info in fisier
fclose ( fp );}

Uniuni
Uniunile sunt asemntoare structurilor, dar lor li se rezerv
o zon de memorie ce poate conine, la momente de timp
diferite, variabile de tipuri diferite. Sunt utilizate pentru a
economisi memoria (se refolosete aceeai zon de memorie
pentru a stoca mai multe variabile). Uniunile se pot declara
astfel:
union numere
{ int i;
float f;
double v;
};
/* se poate utiliza si typedef... */
union numere u1, u2;// declaram variabile de tip union

Uniunea (reuniunea) - union

Definete un grup de variabile care nu se memoreaz


simultan ci alternativ.
Se pot memora diverse tipuri de date la o aceeai adres de
memorie.
Alocarea de memorie se face (de ctre compilator) n
funcie de variabila ce necesit maxim de memorie.
O uniune face parte de obicei dintr-o structur care
mai conine i un cmp discriminant, care specific
tipul datelor memorate (alternativa selectat la un
moment dat).

Uniunea (reuniunea) - union

Cnd scriem ceva ntr-o uniune (de exemplu cnd facem o


atribuire de genul u1.f = 7.4), ceea ce citim apoi trebuie s
fie de acelai tip, altfel vom obine rezultate eronate (adic
trebuie s utilizam u1.f, nu u1.v sau u1.i).
Programatorul trebuie s in evidena tipului variabilei
care este memorat n uniune n momentul curent pentru a
evita astfel de greeli.
Operaiile care se pot face cu structuri se pot face i cu
uniuni; o structura poate conine uniuni i o uniune poate
conine structuri.

Cnd scriem ceva ntr-o uniune (de exemplu cnd facem o


atribuire de genul u1.f = 7.4), ceea ce citim apoi trebuie s fie
de acelai tip, altfel vom obine rezultate eronate (adic
trebuie s utilizam u1.f, nu u1.v sau u1.i).
Programatorul trebuie s in evidena tipului variabilei
care este memorat n uniune n momentul curent pentru a
evita astfel de greeli.
Operaiile care se pot face cu structuri se pot face i cu
uniuni; o structura poate conine uniuni i o uniune poate
conine structuri.

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