Documente Academic
Documente Profesional
Documente Cultură
Structuri de date
dinamice
hexazecimală:
De exemplu,
∎
mai sus.
Pointeri Aritmetica pointerilor -
Incrementare şi decrementare ∎Operatorii
unari de incrementare şi decrementare se pot
cu pointeri.
Pointeri Aritmetica pointerilor
Compararea a doi pointeri ∎Doi
pointeri care indică spre elementele
aceluiaşi tablou pot fi comparaŃi,
folosind operatorii de relaŃie şi de
egalitate.
*tab); }
a[5]={1,2,3,4,5}; tiparire1(a,5);
tiparire2(a,5); tiparire3(a,5);
tiparire4(a,5); }
Pointeri Pointeri şi siruri de
caractere
caracter.
puts(ps);
Prin atribuirea ps=sir; pointerul la caractere ps
\0 )
Alocarea dinamică a
memoriei Principii
∎Multe aplicaŃii pot fi optimizate dacă memoria
necesară stocării datelor lor este alocată
dinamic în timpul execuŃiei programului.
∎Alocarea dinamică de memorie înseamnă
alocarea de zone de memorie şi eliberarea lor în
timpul execuŃiei programelor, în momente
stabilite de programator. ∎Zona de memorie în
care se alocă, la cerere, datele dinamice este
diferită de zona de memorie în care se alocă
datele statice(stiva de date) şi se numeşte heap.
∎SpaŃiul de memorie alocat dinamic este
Alocarea dinamică a
memoriei FuncŃii pentru
gestiunea memoriei dinamice
∎Se considera tipul structurat persoana,
definit în felul următor:
struct persoana { char nume[30]; int varsta;
};
sizeof(int)); }
Alocarea dinamică a
memoriei Alocarea dinamică a
tablourilor şi şirurilor
Un tablou poate fi alocat dinamic
∎
TIP * p; p= (TIP *)
malloc(N*sizeof(TIP)); Pointerul p va
de forma:
TIP p[N];
∎ Avantajul alocării dinamice a unui
&tab[i]); ........ }
Alocarea dinamică a
memoriei Alocarea dinamică a
tablourilor şi şirurilor
((sir2=(char
*)malloc(strlen(sir1)+1))==NULL) {
typedef struct {
char * nume; int varsta; } persoana; int
n; persoana * tab;
Alocarea dinamică a
memoriei Alocarea dinamică a
tablourilor şi şirurilor void citire(void) {
int i; char buf[80]; printf("Introduceti nr de
persoane \n"); scanf("%d", &n); if
(!(tab=(persoana
*)malloc(n*sizeof(persoana)))) {
printf("Eroare alocare dinamica memorie \n");
exit(1); } for (i=0; i<n; i++) {
printf("Introduceti numele persoanei");
scanf("%s", buf); if (!(tab[i].nume=(char
*)malloc(strlen(buf)+1))) {
printf("Eroare alocare dinamica memorie \n");
exit(1); } strcpy(tab[i].nume, buf);
printf("Introduceti varsta persoanei");
scanf("%d",&tab[i].varsta); } }
Alocarea dinamică a
memoriei Concluzii
∎Variabilele dinamice se numesc astfel
pentru că ele apar şi pot să dispară pe
parcursul execuŃiei programului, în mod
dinamic. Alocarea spaŃiului necesar pentru
o asemenea variabilă ca şi relocarea
(eliberarea) lui, se efectuează în mod
explicit în program, prin apelurile malloc şi
free.
∎Timpul scurs din momentul creării locaŃiei
unei variabile şi până la desfiinŃarea
acestei locaŃii se numeşte durata de viaŃă
a variabilei. Pentru variabilele obişnuite
(statice), durata de viaŃă coincide cu durata
de activare a blocului de care aparŃin.
Pentru variabilele dinamice apariŃia şi
dispariŃia lor are loc independent de
structura textului programului iar durata de
viaŃă este intervalul de timp scurs între
apelurile funcŃiilor malloc şi free pentru
acele variabile.
Liste liniare simplu
înlănŃuite DefiniŃii
null varf
listelor neordonate.
&varsta, &adr);
Liste liniare simplu
înlănŃuite Exemplu de program
complet
(((nou=(persoana
*)malloc(sizeof(persoana)))==NULL) ||
((nou->nume=(char
*)malloc((strlen(nume)+1)))==NULL) ||
((nou->adresa=(char
*)malloc((strlen(adr)+1)))==NULL)) {
strcpy(nou->nume,nume);
strcpy(nou->adresa, adr);
lista=nou; }
Liste liniare simplu
înlănŃuite Exemplu de program
complet
Traversarea listei
∎
printf("Introd numele");
scanf("%s",&nume); p=cauta(nume); if
nu exista in lista\n",nume); }
Liste liniare simplu
înlănŃuite Exemplu de program
complet
void modifica(void) { /* modifica adresa unei
scanf("%s",&nume); p=cauta(nume); if
((p->adresa=(char
*)malloc((strlen(adr)+1)))==NULL) {
q2->urm=q1->urm; } free(q1->nume);
\n",nume); }
Liste liniare simplu
înlănŃuite Exemplu de program
complet
void afis_meniu(void){
terminare program\n"); }
terminat=0;
Liste liniare simplu
înlănŃuite Exemplu de program
complet
while (!terminat); }
Liste ordonate Principii
nou lista q2
;);););) q2q2q2q2->urm=nou;
>urm=nou; >urm=nou; >urm=nou;
nounounounou->urm=q1; >urm=q1;
>urm=q1; >urm=q1; ...
*/ if (((nou=(persoana
*)malloc(sizeof(persoana)))==NULL) ||
((nou->nume=(char
*)malloc((strlen(nume)+1)))==NULL) ||
((nou->adresa=(char
*)malloc((strlen(adr)+1)))==NULL)) {
strcpy(nou->nume,nume); strcpy(nou->adresa,
adr); nou->varsta=varsta;
Liste ordonate Exemplu de
program – inserarea unui element
q1!=NULL&&strcmp(q1->nume, nume)<0;
q2=q1,q1=q1->urm);
Liste ordonate Exemplu de
program – eliminarea unui element
if (q1!=NULL &&
strcmp(q1->nume,nume)==0) { if
Crt
Liste dublu înlănŃuite
circulare
crt
Liste dublu înlănŃuite
circulare Parcurgerea listei circulare
Parcurgerea unei liste circulare necesită
anterioare.
Liste multiplu înlănŃuite
Structuri multilistă
p->virsta); }
Liste multiplu înlănŃuite
Structuri multilistă
(persoana*)malloc(sizeof(persoana))) ==
NULL || ( t->nume =
(char*)malloc(strlen(n)+1)) == NULL ) {
printf("Eroare : memorie insuficienta\n");
t->virsta = v; adauga_nume(t);
adauga_varsta(t); } }
Liste multiplu înlănŃuite
Structuri multilistă
Cele două funcŃii, adauga_nume şi
∎
q1=q1->urm_nume); nou->urm_nume =
q2->urm_nume = nou; } }
Liste multiplu înlănŃuite
Structuri multilistă