Biletul nr. 2
Lista este o structur secven ial de date, fiecare element con inând informa ia propriu-
zis i adresa de leg tur cu lat nod.Lista este dublu înl uit dac între nodurile ei sunt
definite dou rela ii de ordine (figura 1).
cap
NULL NULL
Pentru gestionarea lista se utilizeaz variabila pointer cap, iar pentru parcurgere, se
folosesc pointerii urm i pred.
Opera ii pentru liste dublu înl uite:
- crearea unei liste;
- afi area listei;
- accesul la un element al unei liste;
- inserarea unui nod într-o list ;
- tergerea unui nod dintr-o list ;
- tergerea unei liste.
Func iile membre ele clasei list care reprezint implement ri ale opera iilor de mai sus
sunt:
1) Costructorul clasei lista(): se ini ializeaz capul listei cu NULL.
lista(){cap=NULL;}
lista::~lista()
{
1
STRUCTURI DE DATE – Subiecte examen
nod *p;
while(cap!=NULL)
{p=cap;
cap=cap->urm;
delete(p);
}
cap=NULL;
}
3) Func ia membru lista& adaugsf(int info): se insereaz un nod la sfâr itul listei.
void lista::listare()
{
nod *tp;
if(cap){cout<<"\nLista: ";
tp=cap;
while(tp)
{cout<<tp->inf<<" ";
tp=tp->urm;
}
}
else cout<<"\nLista vida";
cout<<"\n\n";
}
2
STRUCTURI DE DATE – Subiecte examen
6) Operatorul – supraînc rcat cu ajutorul func iei membru lista& opertator - (int info):
se terge un nod dup o cheie.
3
STRUCTURI DE DATE – Subiecte examen
return *this;
}
int lista::pop()
{
nod *p;
int x=0;
if(cap){p=cap;
x=p->inf;
cap=cap->urm;
cap->pred=NULL;
delete p;
}
return x;
}
lista& lista::sterge()
{
nod *p;
while(cap!=NULL)
{p=cap;
cap=cap->urm;
delete(p);
}
cap=NULL;
return *this;
}
9) Operatorul [] supraînc rcat cu ajutorul func iei membru int& operator [](int i):
accesul la elementele listei dup un indice.
4
STRUCTURI DE DATE – Subiecte examen
2. Dac num rul telefonic con ine cifrele fiecare în câte un element al listei,
proceda i la definirea func iilor care efectueaz trecerea la noul sistem din 14
numere. Generaliza i.
Solu ia problemei const în transformarea num rului de telefon din 7 cifre într-unul de 14
cifre, prin ad ugarea prefixelor necesare. Cum num rul este memorat prin intermediul
unei liste simplu înl uite sau dublu înl uite, solu ia informatic a problemei se
rezum la implementarea opera iilor de ad ugare de noi noduri în cap tul unei liste.
Astfel se ad ug în ordine invers în cap tul listei curente care con ine num rul de
telefon, cifrele prefixului. De exemplu pentru num rul 1234567 memorat ca în lista
simpl de mai jos:
1 2 3 4 5 6 7
prefix prefix
…..
1 2 3 4 5 6 7
O solu ie general a problemei care necesit mai pu ine opera ii este dat de utilizarea
opera iei de concatenare a dou liste. Astfel, având cele 2 liste, cea a num rului de telefon
existent i cea a prefixului, ob inem num rul de telefon din 14 cifre concatenând prima
lista la cea de-a dou .
5
STRUCTURI DE DATE – Subiecte examen
0 4 0 0 0 2 1
1 2 3 4 5 6 7
6
STRUCTURI DE DATE – Subiecte examen
Concatenarea a dou liste duble este opera ia prin care una din cele doua liste ( ordinea
listelor este aleas de utilizator) se adaug la sfâr itul celeilalte. Acest lucru se face
punând pointerul spre elementul urm tor al ultimului element al primei liste, care avea
valoarea NULL, s con in adresa cap tului celei de-a doua list
Func ia care realizeaz aceast opera ie este concatenlistas(listas * cap,listas * cap1),
care primind ca date de intrare adresele capetelor celor doua liste simple va returna
cap tul primei liste.
Concatenarea listelor : 1 -> 2 -> 3 -> 4 -> 5 -> 6 i 7 -> 8 -> 9 ->0
are ca rezultat lista simpl 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 ->0
Structura de tip list dubl con ine pe lâng informa ie i doi pointeri la aceea i structur :
struct listad {
int info;
listad * d; // legatura la dreapta
listad * s; // legatura la stanga
};
Concatenarea a dou liste duble este opera ia prin care una din cele doua liste se
adaug la sfâr itul celeilalte. Acest lucru se face punând pointerul spre elementul anterior
al cap tului celei de-a doua liste, care avea valoarea NULL, s con in adresa ultimului
element din prima list , iar pointerul spre elementul urm tor al acestui ultim element va
lua valoarea adresei cap tului.
Func ia care realizeaz aceast opera ie este concatenlistad(listad * cap,listad * cap1),
ea primind ca date de intrare adresele capetelor celor doua liste duble i va returna
cap tul primei liste.
7
STRUCTURI DE DATE – Subiecte examen
cap2=cap;
q=cap1;
p->d=q;
//face leg tura între nod final i cap t lista a doua
q->s=p;
//faceleg tura cap t lista a doua i nod final prima list
return cap2;
}
Concatenarea arborilor:
Reprezentarea unei astfel de structuri în aplica iile pentru calculator se poate face prin
definirea unei structuri de forma:
struct nod
{ int info; //informa ia din nod
nod * * fii; //list a fiilor unui nod
int nrfii; //num rul de fii ai nodului
};
Este în esen o list de liste în care fiecare nod p rinte creaz o list a nodurilor fii i
fiecare nod fiu care este p rinte creaz i el o list a nodurilor fii i tot a a.
Concatenarea a doi arbori ordona i este opera ia de ad ugare a celui de-al doilea arbore la
primul arbore legând r cina arborelui care se adaug la un nod al primului arbore.
Astfel r cina acelui arbore devine fiu al nodului la care se concateneaz .
Singura regul a acestei opera ii este c trebuie s se introduc de la tastatur nodul la
care se concateneaz al doilea graf. Acest nod se alege introducând pozi ia sa relativ în
irul care reprezint parcurgerea în preordine a arborelui.
Nodul fiind ales, func ia nod * cautnod(nod * p,int n) se va pozi iona pe acel nod i
întoarce adresa nodului.
Odat nodul g sit, concatenarea este ca i terminat pentru c adresa r cinei arborelui
al doilea se adaug la lista nodurilor fii ale acelui nod iar num rul de fii cre te cu 1.
Func ia care face acest lucru este:
8
STRUCTURI DE DATE – Subiecte examen
1 8
2 3
9 0 3
4 5 6 7 4 7
1 ( 2 (4) 3 ( 5 6 7 ) ) 8 ( 9 ( 4 7 ) 0 3 )
2 3
8 4 5 6 7
9 0 3
4 7 1( 2 ( 8 ( 9 ( 4 7) 0 3 ) 4) 3 ( 5 6 7))
9
STRUCTURI DE DATE – Subiecte examen
În acest caz graful este reprezentat printr-o re ea de liste înlan uite. Graful apare ca un
ansamblu format dintr-o mul ime de noduri i una de arce. De asemenea exist
posibilitatea de preciza informa ia de orientare a arcului i dupa caz cea privind greutatea
arcului.
Definesc structura arcs care se asociaz elementelor din mul imea arcelor:
struct arc {
struct nodgraf * destina ie; /*adresa nodului c tre care
exist arc;*/
struct arcs* next_arc; //referin c tre elementul urm tor;
int greutate; //greutatea arcului;
}
Tipul de structura nodgraf este tot o structur de list . Ea va con ine, pe lâng informa ia
de baz i pe cea de înl uire i trimiterea c tre o parti ie din mul imea arcelor, i anume
lista cuprinzând arcele descendente din nodul respectiv.
struct nodgraf {
int info; //informa ia nodului;
struct nodgraf* next; //referin c tre urm torul nod;
struct arc *capat; //cap tul listei de arce;
}
Definesc concatenarea a doua grafuri ca fiind opera ia de ad ugare a altui graf la unul din
nodurile grafului ini ial respectând urmatoarele reguli:
- Nodul cap t al grafului al doilea se va lega printr-un arc de un nod al primului
graf. Arcul este orientat pe direc ia nod graf 1 ->cap t graf 2.
- Se introduce de la tastatur informa ia nodului unde se va ad uga graful al doilea.
- Dac nodul cap t al grafului 2 este nod în graful 1 i concatenarea se face în acel
nod nu se va mai face nici un arc, completându-se lista de arce a nodului din
graful 1 cu arcele nodului din graful 2.
- Dac nodul final al grafurilor difer , atunci între nodul final al grafului 2 i cel al
primului graf se va forma un arc a c rui informa ie se va citi de la tastatur .
- Dac al doilea graf se leag la nodul final al grafului 1 atunci nodul final al
grafului 2 devine nod final al noului graf ob inut prin concatenarea celor dou
grafuri.
- Dac în graful al doilea se afl minim 2 noduri care se afl i în primul graf, o
condi ie esen ial de a face concatenarea celor dou grafuri este c , dac exist în
ambele grafuri arc în acela i sens între cele dou noduri, acesta s aib aceea i
greutate.
Func ia care verific aceast ultima condi ie este urm toarea: int verificare(nodgraf
*cap,nodgraf *cap2)
10
STRUCTURI DE DATE – Subiecte examen
Func ia care realizeaz concatenarea celor dou grafuri prime te ca date de intrare doi
pointeri la capetele celor dou grafuri i returneaz 0 dac nu se poate face concatenarea
i l dac a reu it. Func ia respectând condi iile de mai sus, adaug la lista nodurilor
grafului 1 i nodurile care nu sunt comune ale grafului 2, iar listele de arce ale acestor
noduri sunt i ele copiate. În cazul nodurilor comune, listele arcelor sunt doar completate
cu arce noi. Exist i cazuri când este nevoie s se creeze arce noi (când se leaga de
exemplu nodurile finale ale grafurilor) iar atunci greutatea lor este citit de la tastatur .
Func ia este:
ultim1=cauta_nodgraf_final(cap);
// memorez ultimul nod al grafului 1
ultim2=cauta_nodgraf_final(cap2);
//memorez ultimul nod al grafului 2
/*se insereaz în lista nodurilor primului graf nodurile necomune din al doilea graf*/
for(q=cap2;q!=NULL;q=q->next)
{
p=cauta_nodgraf(cap,q->info);
if(p==NULL) cap=ins_nodgraf(cap,q->info);
}
/* se copiaz pentru noduri i lista arcelor, iar pentru acele noduri care existau se
completeaz aceast list */
for(q=cap2;q!=NULL;q=q->next)
{
p=cauta_nodgraf(cap,q->info);
if(p!=NULL) for(r=q->capat;r!=NULL;r=r->next_arc)
/*functia ins_arc(nod cap,int surs ,int destina ie,int greutate) insereaz un nou arc catre
nodul cu informa ia destina ie de greutate greutate în lista arcelor nodului cu informa ia
surs din graful cu cap t cap */
ins_arc(cap,p->info,r->destinatie->info,r->weight);
}
11
STRUCTURI DE DATE – Subiecte examen
/* dac nodul unde se face concatenarea nu este cap t al grafului 2 atunci se face arc
între cele dou cu citirea informa iei de la tastatur */
if(cap2->info!=aux->info)
{
printf("\n Distanta dintre nodul ales si capatul grafului 2 este ?");
k=citire();
ins_arc(cap,aux->info,cap2->info,k);
}
/* dac al doilea graf nu se leag la nodul final al primului graf i dac nodurile finale
nu sunt acelea i, atunci ele se leag printr-un arc */
if(aux->info!=ultim1->info)
if(ultim1->info!=ultim2->info)
if(cauta_nodgraf(cap,ultim2->info)==NULL)
/* func ia cauta_nodgraf(nod * cap,int k) cauta un nod cu informa ia k în graful cu cap t
cap, return nd adresa nodului sau NULL */
{
printf("\n Distanta dintre nodul final al grafului 2 si cel al lui 1 este ?");
k=citire();
//se creaz arc intre nod final al grafului 1 si cel al grafului 2
ins_arc(cap,ultim2->info,ultim1->info,k);
}
return 1;
}
1
7 1
9
0 8 3 4 4 6
2 5 6
5 3
2
Graf 1 Graf 2
12
STRUCTURI DE DATE – Subiecte examen
1
7 1
9
0 8 3 4
10
5 3
2 6
4
6
5
Figura 14. Concatenarea a dou grafuri
2. Scrie i func iile pentru num rarea elementelor din structurile de date prin
recursivitate.
13
STRUCTURI DE DATE – Subiecte examen
2 3
4 5 6 7
Figura 8. Un arbore
Reprezentarea unei astfel de structuri în aplica iile pentru calculator se poate face prin
definirea unei structuri de forma:
struct nod
{ int info; //informa ia din nod
nod * * fii; //list a fiilor unui nod
int nrfii; //num rul de fii ai nodului
};
Este în esen o list de liste în care fiecare nod p rinte creaz o list a nodurilor fii i
fiecare nod fiu care este p rinte creaz i el o list a nodurilor fii i tot a a. Astfel arborele
ordonat de mai sus va ar ta în memorie a a:
14
STRUCTURI DE DATE – Subiecte examen
1 2
NULL
2 1 3 3
NULL
NULL
4 0 5 0 6 0 7 0
Aceast modalitate de reprezentare a arborelui este eficient deoarece ocup atât spa iu
cât este nevoie spre deosebire de modalit ile în care fii unui nod sunt reprezenta i printr-
un vectori de pointeri la ace tia, vectorul fiind definit cu un num r limitat de elemente. În
cazul în care un nod nu ar avea fii iar num rul maxim de noduri fii al unui nod este 10,
atunci acel vector al adreselor fiilor ocup spa iu f s -l foloseasc .
La crearea arborelui se va cere introducerea informa iei nodului i a num rului de fii pe
care acest nod îi are. Dup aceasta se ia fiecare fiu în parte i se cere introducerea a
informa iei i a numarului de fii. Definirea arborelui se termin când nici un nod nu mai
are nici un fiu.
Afi area arborelui pe ecran se va face citind arborele în preordine (R cin – Fiu – Fiu –
Fiu …) iar cu ajutorul parantezelor ( i ) vor specificate nodurile de la acela i nivel
(nodurile dintre o pereche de paranteze ( ) se vor afla la acela i nivel) . Deci arborele de
mai sus va fi afi at pe ecran astfel : 1 ( 2 ( 4 ) 3 ( 5 6 7 ) ).
Un graf orientat este o pereche ordonat de mul imi G=(X,U) unde X este o mul ime
finit i nevida numit mul imea vârfurilor (nodurilor), iar U este o mul ime format din
perechi ordonate de elemente distincte din X numit mul imea arcelor.
Orice arc u care apar ine mul imii U va fi notat cu u=(x,y) i spunem c x este
extremitate ini ial iar y este extremitate final a arcului u. Arcul (x,y) difera de arcul
(y,x).
Reprezentarea prin matrice de adiacen a a grafurilor este ineficient când num rul
mediu de arce dintre noduri este mic (gradul de umplere al matricei de adiacen este
sc zut). Cea mai mare parte a memoriei necesar stoc rii matricei de adiacen este
nefolosit . Exist apoi situa ii în care nu se cunoa te aprioric num rul maxim de noduri
ale grafului, apelându-se la construirea dinamic a grafului, pe parcursul rezolv rii
problemei, deci nu se cunoa te dimensiunea matricei de adiacen . În aceste situa ii graful
se poate reprezenta printr-o re ea de liste înlan uite.
i în aceast reprezentare, graful apare ca un ansamblu format dintr-o mul ime de
noduri i una de arce. De asemenea trebuie s existe posibilitatea de preciza informa ia de
orientare a arcului i dupa caz cea privind greutatea arcului.
Definesc structura arcs care se asociaz elementelor din mul imea arcelor:
struct arc {
15
STRUCTURI DE DATE – Subiecte examen
0 8 3 9 4
5 3
2
Figura 12. Un graf orientat
0 1 2 3 4
@1 7 @2 8 @3 3 @4 9 NULL
16
STRUCTURI DE DATE – Subiecte examen
Matricele rare sunt acele masive bidimensionale ale c ror elemente nenule reprezint o
pondere de mai pu in 1/3 din num rul total de elemente. Astfel de matrice sunt
reprezentate în memorie în moduri neconven iale, memorându-se doar elementele
nenegative, restul având valoarea 0.
O astfel de metod este i cea care utilizeaz pentru acest lucru o list dublu înl uit .
Astfel, fiecare element al listei con ine 3 informa ii: indicele liniei i coloanei elementului
diferit de 0, i valoarea acestuia. Structura general a acestei liste este:
Struct lista_matr_rara
{
int linie;
int coloana;
tip valoare_elem;
lista_matr_rara * next;
lista_matr_rara *pred;
}
Cap tul listei re ine informa ii despre dimensiunea matricei rare, elementele linie i
coloana reprezentând num rul de linii respectiv coloane, iar valoare_elem are valoarea 0.
Transpunerea matricelor rare este similar celei efectuate pe structur tablou, constând în
inversarea indicilor de linie i coloan între ei. În cazul de fa se inverseaz pointerii la
masivele de întregi reprezentând liniile, respectiv coloanele elementelor nenule:
17
STRUCTURI DE DATE – Subiecte examen
}
return capat;
}
struct listas {
int info; //informa ia
listas * next; //leg tura la elementul urm tor
};
Deconcatenând o list simpl , aceasta se rupe rezultând astfel dou liste simple. Cum în
list exist sau nu mai multe elemente cu aceea i valoare, elementul de unde se
deconcateneaz este ales prin indicarea pozi iei sale în list .
Fiind ales nodul de unde se deconcateneaz , acesta devine cap tul noii liste, iar pointerul
elementului anterior lui va lua valoarea NULL i elementul va deveni sfâr itul primei
liste.
Func ia care realizeaz acest lucru pime te ca date de intrare cap tul primei liste i va
returna cap tul listei simple nou formate.
18
STRUCTURI DE DATE – Subiecte examen
Observa ie : deconcatenând lista de la primul element, noua lista va fi chiar lista ini ial .
NULL
19
STRUCTURI DE DATE – Subiecte examen
temp = elemF;
elemF->info = elemB->info;
elemF->next = elemB->next;
elemB->info = temp->info;
elemB->next= temp->next;
}
NULL NULL
elemF->info = elemB->info;
elemF->dr = elemB->dr;
elemF->st = elemB->st;
elemB->info = temp->info;
elemB->dr = temp->dr;
elemB->st = temp->st;
}
20
STRUCTURI DE DATE – Subiecte examen
Variabilele pointer reprezint tipuri de date al c ror con inut reprezint adrese de
memorie unde se afl valorile diferitelor variabile utilizate de program.
Avantajele utiliz rii pointerilor se concretizeaz în definirea dinamic a zonei de
memorie de lucru, eliminându-se irosirea nejustificat de spa iu, precum i în accesul
imediat la un element anume al structurii de date, pentru c în caz contrar este necesar
parcurgerea acesteia pân la elementul respectiv.
În cazul structurilor de date de tip vector:
- definirea se realizeaz prin sinataxa tip * nume_vector;
- referirea elementului k al vectorului de n elemente este *(pointer_vector + (k-1)),
unde k variaz de la 1 la n.
De exemplu, elementul al 5-lea al vectorului definit int * vect, este *(vect + 4).
În cazul structurilor de date de tip list simplu sau dublu înl uit :
- definirea se realizeaz prin sintaxa
struct lista //pentru lista simplu înl uit
{
int info;
lista * next;
}
2. Scrie i func ia de normalizare dintr-o list simpl asociat unei matrice rare.
Matricele rare sunt acele masive bidimensionale ale c ror elemente nenule reprezint o
pondere de mai pu in 1/3 din num rul total de elemente. Astfel de matrice sunt
reprezentate în memorie în moduri neconven iale, memorându-se doar elementele
nenegative, restul având valoarea 0.
21
STRUCTURI DE DATE – Subiecte examen
O astfel de metod este i cea care utilizeaz pentru acest lucru o list simpl . Astfel,
fiecare element al listei con ine 3 informa ii: indicele liniei i coloanei elementului diferit
de 0, i valoarea acestuia. Structura general a acestei liste este:
Struct lista_matr_rara
{
int linie;
int coloana;
tip valoare_elem;
lista_matr_rara * next;
}
Cap tul listei re ine informa ii despre dimensiunea matricei rare, elementele linie i
coloana reprezentând num rul de linii respectiv coloane, iar valoare_elem are valoarea 0.
Opera ia de normalizare, reprezint procesul construirii matricei rare ini iale pornind de
la un tip ca acesta de reprezentare eficient a ei. Subrutina de normalizare const în
generarea unei matrice ini iale de dimensiunile [nr_linii][nr_coloane] cu toate
elementele 0, i apoi parcurgând lista în ordine ini ializarea elementelor acesteia date de
[linie][coloana] cu [valoare_elem].
for(i=0;i<n;i++)
for (j=0;j<m;j++) pmat[i][j]=0;
*n = capat->linie;
*m = capat->coloana;
for (capat=capat->next ; capat != NULL ; capat = capat->next)
pmat [capat->linie][capat->coloana] = capat->valoare_elem;
return pmat;
}
Func ia care terge k elemente consecutive dintr-o list simpl , este o func ie care
apeleaz de k ori metoda de tergere a unui element. Pentru a terge un element e dintr-o
list simplu înl uit este suficient ca leg tura lista * next a elementului precedent lui e
nu mai con in adresa loca iei de memorie unde se afl elementul e, ci adresa zonei de
memorie asociat succesorului lui e. În concluzie, solu ia se rezum la a schimba valorile
unor variabile pointer.
22
STRUCTURI DE DATE – Subiecte examen
De i elementul e nu mai apar ine listei, el ocup în mod nejustificat spa iu de memorie
pân la terminarea aplica iei, i de aceea o rezolvare complet a tergerii unui element
include i dealocarea zonei de memorie ocupat de acesta.
Opera ia de inserare elemente în structuri de date cunoscute este opera ia prin care se
adaug un nou element la o structur de date definit i ale c rei elemente sunt cunoscute.
Aceast procedur se realizeaz respectând reguli care caracterizeaz structura existent ,
de exemplu elementele sale sunt într-o anumit regul , sau în func ie de necesit ile
programului, de exemplu se însereaz elemente noi la început, la sfâr it sau dup un
element specificat.
În func ie de structura de date folosit , opera ie de inserare respect anumite condi ii:
- în cazul vectorilor, inserarea unui nou element duce la crearea unui nou vector
care s con in i elementul inserat;
23
STRUCTURI DE DATE – Subiecte examen
- în cazul grafului, opera ia de inserare este cea mai complex dintre cele
enumerate pentru c implic modific ri la nivelul multor structuri folosite (lista
nodurilor, lista arcelor, listele predecesorilor etc.).
24
STRUCTURI DE DATE – Subiecte examen
Traversarea listelor se face în func ie de rezultatul urm rit, existând mai multe
posibilit i: fie se parcurge una dintre liste i pentru fiecare element citit se g se te i
nodul asociat din ce de-a doua list (prin intermediul pointerului c tre el), fie se parcurg
în paralel ambele liste.
Implementarea primului procedeu conduce la realizarea procedurii urm toare:
4. Compresa i textul :
25
STRUCTURI DE DATE – Subiecte examen
Gradul de referire a structurilor de date este un indicator care descrie modul de folosire a
diferitelor structuri de date definite în interiorul unui program. Avantajul utiliz rii acestui
indicator const în realizarea unei analize a aplica iei care s conduc în final la alegerea
structurii de date optime care s aib eficien maxim .
De exemplu într-un program care implementeaz lista simpl i dublu înl uit , un
vector i o matrice gradul de referire a structurilor de date este definit ca fiind procentul
num rului de instruc iuni care refer elementele unei structuri, din totalul instruc iunilor.
Astfel, se analiza dac structura care are un grad de referire mic este indicat pentru
programul respectiv sau dac problemele care duc la acest procent mic pot fi sau nu
înl turate.
Func ia de desortare este opera ia prin care termenii unui ir ce sunt a eza i ini ial în
ordine cresc toare sau descresc toare sunt amesteca i astfel încât s nu mai aib
proprietatea de la început.
De exemplu func ia urm toare prime te ca date de intrare o list simplu înl uit sortat
cresc tor i fiecare 2 elemente le interschimb între ele.
Lista * desortare (lista * cap)
{
lista * temp;
26
STRUCTURI DE DATE – Subiecte examen
lista * cap_nou;
if (cap && cap->next)
{
temp = cap->next;
cap->next = temp->next;
temp->next = cap;
cap_nou = temp;
for(cap = cap->next ; cap->next != NULL && cap->next->next != NULL ;
cap = cap->next)
{
temp = cap->next;
cap->next = temp->next;
temp->next = cap;
}
}
else return cap;
return cap_nou;
}
În majoritatea programelor întâlnim mai multe tipuri fundamentale de date (integer, real,
bool, pointer, etc), lucru care prezint atât avantaje cât i dezavantaje. Avantajul este dat
de faptul c astfel fiec rei variabile i se aloc atât spa iu cât este necesar, neexistând
situa ii când acesta este irosit. Dar acest lucru implic o urm rire atent a opera iilor
dintre variabile pentru c exist posibilitatea pierderii de informa ie datorit trecerii de la
un tip la altul.
Pentru a m sura diversitatea de tipuri de date dintr-un cod surs , se define te gradul de
omogenitate a datelor calculat pentru fiecare tip în parte ca num rul de operatori de acel
tip pe num rul total de operatori.
27
STRUCTURI DE DATE – Subiecte examen
NULL NULL
elemF->info = elemB->info;
elemF->dr = elemB->dr;
elemF->st = elemB->st;
elemB->info = temp->info;
elemB->dr = temp->dr;
elemB->st = temp->st;
}
28
STRUCTURI DE DATE – Subiecte examen
Func ia care realizeaz traversarea unui arbore binar de c utare în vederea unei liste
simplu înl uite are la baz o metod de traversare a arborelui, preordine, inordine sau
postordine, i func ia inssf ( ) care insereaz un element nou la sfâr itul listei.
De exemplu func ia care creeaz o list simpl , list, din parcurgerea arborelui binar în
preordine con ine instruc iunile:
Structurile de date dinamice sunt: lista simplu sau dublu înl uit , arborele i graful. Ele
sunt numite dinamice pentru c dimensiunea lor nu este constant din momentul definirii
lor i pân în momentul termin rii programului, ci variaz prin ad ug ri sau scoateri de
elemente.
Opera ia de inserare este opera ia prin care se adaug noi elemente la structura existent .
- în cazul listelor, inserarea de elemente are loc la începutul listei, în interiorul ei
sau la sfâr it, alegerea tipului depinzând de rezultatul urm rit;
29
STRUCTURI DE DATE – Subiecte examen
nou->info=info;
nou->next=NULL;
if (cap==NULL) return nou;
temp=cap;
while (temp->next) temp=temp->next;
temp->next=nou;
return cap;
}
30
STRUCTURI DE DATE – Subiecte examen
2. Scrie i func iile pentru c utarea unui element dup cheie în structuri de date.
Procedura de c utare a unui element dup cheie în structuri de date se reduce la opera ia
de comparare a termenilor structurii lua i pe rând cu valoarea cheii.
- în cazul vectorilor func ia returneaz fie pozi ia elementului în vector, fie valoarea
–1;
- în cazul listelor simplu sau dublu înl uite, func ia returneaz adresa elementului
sau valoarea NULL;
- în cazul arborilor binari, func ia returneaz adresa nodului sau valoarea NULL;
31
STRUCTURI DE DATE – Subiecte examen
Dac consider m c matricea are n elemente, fiecare element fiind scris pe un octet
atunci fi ierul ocup n2 octe i. Metoda de compresie aplicat în aceast situa ie pleac de
la ipoteza c matricea este scris în fi ier sub forma unui ir de n2 elemente identice.
Astfel, acest ir compresat devine num rul de elemente al irului urmat de simbolul care
se repet , el ocupând în final 3 octe i (presupunem c n2 este un num r care se scrie pe 2
octe i)
1. Scrie i ecua iile pentru realizarea opera iilor de: inserare, interschimb i
tergere în liste duble.
NULL NULL
elemC->dr = nou;
nou->st = elemC;
nou->dr = elemD;
elemD->st = nou;
}
32
STRUCTURI DE DATE – Subiecte examen
- elementul B ia valoarea lui temp, iar pointerii b->dr i b->st iau valorile lui temp-
>dr i temp->st.
elemF->info = elemB->info;
elemF->dr = elemB->dr;
elemF->st = elemB->st;
elemB->info = temp->info;
elemB->dr = temp->dr;
elemB->st = temp->st;
}
if (elem_sters->st == NULL)
{
delete (elem_sters);
return elem_sters->dr;
}
else if (elem_sters->dr == NULL)
{
temp = elem_sters->st;
temp->dr = NULL;
delete (elem_sters);
return cap;
}
temp = elem_sters->st;
33
STRUCTURI DE DATE – Subiecte examen
temp->dr = elem_sters->dr;
temp = elem_sters->dr;
temp->st = elem_sters->st;
}
2. Scrie i func iile pentru num rarea elementelor listei simple, listei duble i
arbori binari.
- num rarea elementelor listei simplu înl uite;
34
STRUCTURI DE DATE – Subiecte examen
3. Lua i un text oarecare, compresa i-l folosind doi algoritmi diferi i i efectua i
analiza rezultatelor.
Fie textul:
Dintre sute de catarge
Care leag malurile
Câte oare le vor sparge
Vânturile, valurile
A fost odat c-n pove ti
A fost ca niciodat
Din rude mari împ te ti
O prea frumoas fat .
Aceste grupuri de litere sunt puse în coresponden cu codul unui caracter, altul decât
cele 48 considerate.
Astfel, versurile eminesciene care însumeaz 177 caractere incluzând i spa iile care
separ cuvintele, sunt compacte astfel:
35
STRUCTURI DE DATE – Subiecte examen
Dx x sux de x x rge
17 64 26 36 27
x x x aga x lux x
26 24 12 62 57 12
Vix ux x , valux x
48 57 12 57 12
A fox odat c-an povex
53 73
A fox x x ciodat
53 26 16
Dx rude x x ix aratx
17 62 57 15 74
o x x frumx fata.
13 33 85
177 − 137
p= * 100 = 22%
177
Construirea matricei generale a sub irurilor, are avantajul c este unic pentru orice text
care se compacteaz , dar poate apare situa ia ca frecven ele grupurilor în textul de
compact, s nu urmeze nivelurile de frecven a textelor care au stat la baza ob inerii ei.
177 * 8 − 116 * 6
p= * 100 = 52%
177 * 8
36
STRUCTURI DE DATE – Subiecte examen
1. Scrie i ecua iile pentru realizarea opera iilor de: inserare, interschimb i
tergere în liste simple.
NULL
elemC->dr = nou;
nou->dr = elemD;
}
elemF->info = elemB->info;
37
STRUCTURI DE DATE – Subiecte examen
elemF->next = elemB->next;
elemB->info = temp->info;
elemB->next= temp->next;
}
if(cap)
if(cap->inf==k)
{
lista *temp=cap;
cap=temp->next;
free (temp);
sterg_nod(cap,k);
}
else sterg_nod(cap->next,k);
}
2. Scrie i func iile pentru afi area unui anumit element din lista simpl , lista
dubl i arborele binar.
- afi area unui anumit element din lista simplu înl uit (al k-lea element);
- afi area unui anumit element din lista dublu înl uit (al k-lea element);
38
STRUCTURI DE DATE – Subiecte examen
- afi area unui anumit element din arborele binar (dac pe lâng informa ia util
fiecare nod con ine i o cheie de c utare);
3. Lua i un text oarecare, compresa i-l folosind doi algoritmi diferi i i efectua i
analiza rezultatelor.
Fie textul:
Dintre sute de catarge
Care leag malurile
Câte oare le vor sparge
Vânturile, valurile
A fost odat c-n pove ti
A fost ca niciodat
Din rude mari împ te ti
O prea frumoas fat .
39
STRUCTURI DE DATE – Subiecte examen
Aceste grupuri de litere sunt puse în coresponden cu codul unui caracter, altul decât
cele 48 considerate.
Astfel, versurile eminesciene care însumeaz 177 caractere incluzând i spa iile care
separ cuvintele, sunt compacte astfel:
Dx x sux de x x rge
17 64 26 36 27
x x x aga x lux x
26 24 12 62 57 12
Vix ux x , valux x
48 57 12 57 12
A fox odat c-an povex
54 73
A fox x x ciodat
53 26 16
Dx rude x x ix aratx
17 62 57 15 74
40
STRUCTURI DE DATE – Subiecte examen
o x x frumx fata.
13 33 85
177 − 137
p= * 100 = 22%
177
Construirea matricei generale a sub irurilor, are avantajul c este unic pentru orice text
care se compacteaz , dar poate apare situa ia ca frecven ele grupurilor în textul de
compact, s nu urmeze nivelurile de frecven a textelor care au stat la baza ob inerii ei.
177 * 8 − 116 * 6
p= * 100 = 52%
177 * 8
Stiva este tot o structur de tip list simplu înl uit , îns ceea ce o deosebe te de
aceasta este proprietatea c scoaterea elementelor se fac totdeauna la acela i cap t al
listei, conform principiului LIFO (ultimul intrat, primul ie it).
vârf de stiv →
a ← baza 41
NULL
STRUCTURI DE DATE – Subiecte examen
- Ad ugarea unui element în stiv , se face de regul cu mutarea pozi iei vârfului
stivei pe componenta ad ugat .
- tergerea unui element din stiv , se efectueaz de regul asupra elementului din
vârful stivei, aceasta coborând pe componenta ce îl precede.
42
STRUCTURI DE DATE – Subiecte examen
stiva* p;
int el;
if (vs == NULL) return -1;
else
{
p = vs->prec;
el = vs->info;
free(vs);
vs = p;
return el;
}
};
2. Scrie i func ia de tergere a unui element dintr-o list dublu înl uit .
Opera ia de tergere a unui element al listei nu este o opera ie dificil , îns ea implic o
gestiune atent a variabilelor pointer care leag elementele în list .
Func ia descris mai jos, verific prima dat dac elementul dorit nu este chiar cap tul
listei, caz în care succesorul acestuia devine noul cap t. Urm toarele dou situa ii
abordate sunt cele în care elementul de ters este ultimul din list sau în interiorul
acesteia.
43
STRUCTURI DE DATE – Subiecte examen
int bol=1;
listad *pt,*p;
if(!cap) bol=0;
else if(info==cap->inf) {
p=cap;
cap=cap->urm;
cap->pred=NULL;
delete p;
}
else {
pt=cap;
while((pt->inf != info)&&(pt->urm)) pt=pt->urm;
if(info!=pt->inf) bol=0;
else if((info==pt->inf)&&(pt->urm==NULL))
{
p=pt;
pt->pred->urm=NULL;
delete p;
}
else {
p=pt;
pt->pred->urm=pt->urm;
pt->urm->pred=pt->pred;
delete p;
} }
}
if (!bol) cout<<"\n "<<info<<" nu se afla in lista";
else cout<<"\n Stergere cu succes";
return cap;
}
44
STRUCTURI DE DATE – Subiecte examen
Astfel, xij reprezint num rul de apari ii al literei cu pozi ia i, urmat de liter cu pozi ia j
din alfabet.
Construirea matricei X se realizeaz , prin parcurgerea unei diversit i de texte i
frecven ele depind de particularit ile fonetice ale fiec rei limbi.
Dintre grupurile de câte dou litere, vor fi extrase acelea cu frecven ele cele mai mari i
vor fi dispuse pe linii într-un tabel, ale c rui coloane con in literele alfabetului.
Se construie te matricea Y, ale c rei elemente yij, con in frecven ele de apari ie ale
grupului de dou litere de pe linia I, urmat de litere de pe coloana j a tabelului.
Se are în vedere c totalitatea grupurilor de litere ce vor fi selectate în ordinea
descresc toare a frecven elor de apari ie, s nu dep easc un num r K a a fel încât:
K + L < 256
unde, L reprezint num rul de caractere considerat necesar pentru introducerea unui text
într-un fi ier.
În continuare, se vor considera cele 27 litere ale alfabetului, cele 10 simboluri ale cifrelor
i caracterele: spa iu, plus, minus, egal, punct, virgul , dou puncte, punct i virgul ,
semnul mir rii, semnul întreb rii i asteriscul. În total sunt 48 de caractere.
Din analizele statistice efectuate pe texte, se re in grupurile de litere alc tuind o mul ime
format din 64 de elemente dispuse în tabloul de mai jos, care au în dreptul liniilor i
coloanelor combina ii de bi i care alc tuiesc codul asociat fiec rui ir.
Aceste grupuri de litere au fost puse în coresponden cu codul unui caracter, altul decât
cele 48 considerate.
Astfel, versurile eminesciene care însumeaz 94 caractere incluzând i spa iile care
separ cuvintele i versurile, vor fi compacte astfel:
A fox x x ciodat
53 26 16
Dx rude x x ix aratx
17 62 57 15 74
O x x frumx fata.
13 33 85
45
STRUCTURI DE DATE – Subiecte examen
94 − 81
p= * 100 = 13%
94
Construirea matricei generale a sub irurilor, are avantajul c este unic pentru orice text
care se compacteaz , dar poate apare situa ia ca frecven ele grupurilor în textul de
compact, s nu urmeze nivelurile de frecven a textelor care au stat la baza ob inerii ei.
Dac pentru fiecare compactare, se construie te o matrice de sub iruri proprie,
performan a este cu totul alta.
Cei doi vectori reprezint frunzele unui arbore binar, adic fiecare nod frunz al
arborelui, frunz [i], con ine 2 informa ii: valoarea elementului i al primului vector
respectiv celui de-al doilea.
Solu ia acestei probleme const în g sirea nodurilor frunz ale arborelui i în calculul
sumei celor n produse (elementul i al primului vector înmul it cu elementul i al celui de-
al doilea masiv).
Structura unui nod al arborelui este:
struct nod_arbore
{
nod_arbore *st;
nod_arbore *dr;
int val_elem_vect2;
int val_elem_vect2;
}
46
STRUCTURI DE DATE – Subiecte examen
Lista dubl este i ea asemenea listei simplu înl uite tot o structur secven ial de
date, fiecare element con inând informa ia propriu-zis i, aici este deosebirea între cele
dou liste, adresele de leg tur cu alte doua noduri, elementul urm tor i cel anterior din
list .
Primul element din list are întotdeauna pointerul spre nodul anterior pus pe NULL, iar
ultimul element are NULL, pointerul spre elementul anterior.
Structura de tip list dubl va con ine pe lâng informa ie i doi pointeri la aceea i
structur :
struct listad {
int info;
listad * d; // legatura la dreapta
listad * s; // legatura la stanga
};
Reprezentarea în memorie sub forma unei liste duble a urm torului ir de elemente : 1, 2,
3, 4, 5, 6 este:
NULL
NULL
1 2 3 4 5 6
Func iile membre ele clasei list care reprezint implement ri ale opera iilor de mai sus
sunt:
1) Costructorul clasei lista(): se ini ializeaz capul listei cu NULL.
lista(){cap=NULL;}
lista::~lista()
{
47
STRUCTURI DE DATE – Subiecte examen
nod *p;
while(cap!=NULL)
{p=cap;
cap=cap->urm;
delete(p);
}
cap=NULL;
}
3) Func ia membru lista& adaugsf(int info): se insereaz un nod la sfâr itul listei.
void lista::listare()
{
nod *tp;
if(cap){cout<<"\nLista: ";
tp=cap;
while(tp)
{cout<<tp->inf<<" ";
tp=tp->urm;
}
}
else cout<<"\nLista vida";
cout<<"\n\n";
}
48
STRUCTURI DE DATE – Subiecte examen
6) Operatorul – supraînc rcat cu ajutorul func iei membru lista& opertator - (int info):
se terge un nod dup o cheie.
49
STRUCTURI DE DATE – Subiecte examen
int lista::pop()
{
nod *p;
int x=0;
if(cap){p=cap;
x=p->inf;
cap=cap->urm;
cap->pred=NULL;
delete p;
}
return x;
}
lista& lista::sterge()
{
nod *p;
while(cap!=NULL)
{p=cap;
cap=cap->urm;
delete(p);
}
cap=NULL;
return *this;
}
50
STRUCTURI DE DATE – Subiecte examen
void CArbBin::inord(Nod_arbore*rad)
{
if(rad)
{
inord(rad->ss);
cout<<rad->inf<<"\t";
inord(rad->sd);
}
}
void postord(Nod_arbore*rad)
{
if(rad)
{
postord(rad->ss);
postord(rad->sd);
cout<<rad->inf<<"\t";
}
}
51
STRUCTURI DE DATE – Subiecte examen
2 8
1 7 9
struct arbore_binar
{
int valoare;
arbore_binar *stanga;
arbore_binar *dreapta;
};
52
STRUCTURI DE DATE – Subiecte examen
Func ia care compar dou liste simplu înl uite prime te ca date de intrare capetele
listelor i verific care lista are mai multe elemente. Dac prima list este mai mare
func ia returneaz valoarea 1, dac este mai mic returneaz valoarea 2 i dac listele
sunt egale returneaz valoarea 0.
53
STRUCTURI DE DATE – Subiecte examen
Acest text este compresat folosind dic ionarul {ziua, ninge, noaptea, diminea a, iar }, ale
rui elemente sunt înlocuite cu simbolurile {#, $, %, ^,&}. Deci textul arat compresat
astfel: # $, % $
^$&
$, $, $, $
& i& i&
98 − 43
, ob inându-se o compresie de = 56% , dar s nu uit m c fi ierul compresat
98
trebuie s includ i biblioteca pentru ca apoi s fie decompresat. Deci fi ierul compresat
con ine i caracterele : ziua ninge noaptea dimineata iar 0 # $ % ^&. În final compresia
98 − 43 − 51
este de = 0,4% .
98
O alt metod de compresie este aceea în care g sim secven e repetitive în text i le
înlocuim cu o singur apari ie a secven ei precedat de indicele de repeti ie. Astfel
ob inem textul:
1 Ziua 1 ninge, 1 noaptea 1 ninge
1 Diminea a 1 ninge 1 iar
4 Ninge
2 Iar i 1 iar
98 − 92
cu o compresie de: = 0.6% .
98
În nici unul din cazuri nu s-a ob inut o compresie bun , lucru datorat în mare parte i
faptului c textul este foarte mic.
54