Documente Academic
Documente Profesional
Documente Cultură
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 !
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
1. struct student
{ char nume[40]; int an; float medie; };
2.
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
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;
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;}
#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