Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică a Moldovei Catedra Informatica Aplicată
RAPORT Lucrarea de laborator nr.!" la Structuri de date si algoritmi
A efectuat# st. $r. %I!&"&
'.Cucu
A verificat# dr.( conf.univ.
M. )ulev
Chi*inău +,&,
Tema: Implementarea tipului de date abstract Arbore binar $enirali/at0 in limba1ul C. Al$oritmi iterativi si al$oritmi recursivi. Scopul lucrarii: 2bținerea deprinderilor de implementare practice in limba1ul C a tipului de
date abstract 3T'A4 Arbore binar $enirali/at0( utili/5nd al$oritmi iterativi si recursivi.
Sarcina de lucru: 'e scris trei fișiere 5n limba1ul C pentru implementarea 3+ fisiere4 si utili/area
3& fișier 6 pro$ram cu funcția main4 a T'A Arbore binar $enirali/at 0# &. 7ișierul antet cu e8tensia 3h) care descrie structura nodului al arborelui binar 3conform variantei din lucrarea de laborator &4 și prototipurile funcțiilor care asi$ură operațiunile de prelucrare a arborelui binar. 9entru lucrare de laborator 4 5n acest fișier trebuie de adau$at descrierea structurilor elementelor co/ei și a stivei unde vor fi stocate adresele nodurilor ale arborelui binar precum și prototipurile funcțiilor de inserare și eliminare a elimentului pentru coada și stiva respectiv. +. 7isier cu e8tensia 3cpp sau c4 care con ține codurile 3implementările4 tuturor funcțiilor declarate 5n fișierul antet. :. 7i șierul utili/atorului ! pro$ramul cu funcția main 34 pentru prelucrarea arborelui binar cu afișarea meniului de optiuni pe ecran( si anume# crearea arborelui binar $enirali/at 5mpreuna cu introducerea informației nodurilor arborelui de la tastatură 5n re1im interactiv( afiș area informatiei despre nodurile arborelui pe ecran și a adreselor nodului current( copilului stin$ și copilului drept al acestora( căutarea nodului după un c5mp informațional al nodului( determinarea numărului de noduri 5n arbore( determinarea 5nalțimei a arborelui( eliberarea memoriei dinamice alocate pentru arbore( ieșire din pro$ram. ;n lucrare de laborator 4 funcțiile de prelucrare ale arborelui binar trebuie impementate folosind algoritm iterativ 5n + versiuni# a) utilizînd coada ! pentru parcur$erea arborelui 5n lar$ime 3parcur$erea arborelui pe niveluri4 și b) utilizînd stiva 6 pentru parcur$erea arborelui 5n ad5ncime 3parcur$erea inordine# rădăcină !< subarbore st5n$3drept4 !< subarbore drept3st5n$4. 2 e8cepție face funcția de eliberare a memoriei dinamice alocate pentru arbore 3 trebuie folosită parcur$erea postordine# subarbore st5n$3drept4 !< subarbore drept3st5n$4 !< rădăcină4. ;n lucrare de laborator 5 funcțiile de prelucrare ale arborelui binar( trebuie implementate folosind algoritm recursiv pentru parcur$erea arborelui 5n ad5ncime# rădăcină !< subarbore st5n$3drept4 !< subarbore drept3st5n$4. Și aici o e8cepție face funcția de eliberare a memoriei dinamice alocate pentru arbore 3trebuie folosită parcur$erea postordine# subarbore st5n$3drept4 !< subarbore drept3st5n$4 !< rădăcină4. ;n lucrare de laborator 5 funcția de afișare a informaței despre nodurile arborelui pe ecran( precum și a adreselor nodului current( copilului stin$ și copilului drept al acestora trebuie impementată pentru toate parcur$erile recursive posibile ale arborelui binar.
&
Varianta !: Stat "o#iuni de baz$
Un arbore binar e o multime de n <= , noduri( care daca nu este vida( contine un nod numit radacina( restul nodurilor formand doi arbori dis1uncti numiti subarborele stan$ si subarborele drept. Aceasta structura de date e importanta pentru ca e usor de repre/entat si prelucrat( orice arbore putand fi transformat in arbore binar . 9rincipalele modalitati de parcur$ere ale unui arbore binar sunt# A4 Arborii binari pot fi parcursi prin metode specifice $rafurilor# in adancime( latime. >4 Metode specifice arborilor binari # 9arcur$erea in inordine 3stan$a 6varf 6 dreapta %?'4 6 se parcur$e mai intai subarborele stan$( apoi varful( apoi subarborele drept. 9arcur$erea in preordine 3varf! stan$a 6 dreapta ?%'4 6 se parcur$e mai intai varful( apoi subarborele stan$( apoi subarborele drept. 9arcur$erea in postordine 3stan$a 6 dreapta 6 varf %'?4 6 se parcur$e mai intai subarborele stan$( apoi subarborele drept si la sfarsit varful. •
•
•
%olutiile de parcur$ere ale arborelui din fi$ura urmatoare # parcur$ere svd ! in inordine +"&-:@ parcur$ere vsd ! in preordine &+":-@ parcur$ere sdv ! in postordine "+-@:&
Analiza datelor %unctia main: comand! variabila locala( variabila de tip inte$er( comanda pentru ale$ere din meniu m&m&m'&m(!variabila locala de tip inte$er( indicele ciclului respectiv t variabila locala returnabila de tip structura( adresa elementului de cautat *name!variabila locala de tip character( adresa denumirii statului introdus de la tastatura
+
%unctia: creat+,-)&creat+s-)&creat+r-) si s.o/+,-)&s.o/+s-)& s.o/+r-) p variabila locala de tip structura( adresa nodului parinte cvariabila locala de tip structura( adresa nodului copil * ! variabila locala de tip inte$er(variabila dedicate pentru ale$erea optiunii
%unctia: in,-nod0v) si del,-)
c!variabila locala de tip structura( adresa elementului inserat3sters4 in coada v variabila locala de tip structura %unctia: pop-)& pus.-nod0v)
c!variabila locala de tip structura( adresa elementului inserat3sters4 in stiva v variabila locala de tip structura %unctia: searc.+s-)&searc.+,-)&searc.+r-) p variabila locala de tip structura( adresa nodului parinte cvariabila locala de tip structura( adresa nodului copil t! variabila locala de tip pointer la structura( adresa elementului de cautat %unctia: *reemem+,-)&*reemem+s-)&*reemem+r-nod 0c) p variabila locala de tip structura( adresa nodului parinte cvariabila locala de tip structura( adresa nodului copil %unctia: size+,-)&size+s-)& size+r-nod 0c) p variabila locala de tip structura( adresa nodului parinte cvariabila locala de tip structura( adresa nodului copil s variabila locala de tip inte$er( numarul de elemente 1odul programului: %isierul 2struct3.
BBArbore tpedef struct nodD char denumire,FG char capitala,FG int supG int nlG float pibG struct nod HleftG struct nod Hri$htG nodG nod HrootG BBCoada tpedef struct elJD nod HadrnodG struct elJ Hne8tG elJG elJ HfirstG elJ HlastG BB%tiva :
tpedef struct elsD nod HadrnodG struct els HprevG elsG els HtopG BB9rototipuri void findKerror3int ord4G int inJ3nod Hv4G nodH delJ34G int push3nod Hv4G nodH pop34G int creatKJ34G int creatKs34G int creatKr34G int shoKJ34G int shoKs34G void shoKr3nod Hc4G nodH searchKJ3char Hfname4G nodH searchKs3char Hfname4G nodH searchKr3nodH c( char Hfname4G int si/eKJ34G int si/eKs34G int si/eKr3nod Hc4G void freememKr3nod Hc4G int freememKJ34G int freememKs34G int hei$htKr3nod Hc4G %isierul 2*unct3cpp include Nstdio.h< include Nstdlib.h< include Nstrin$.h< include Ostruct.hO define pause printf3OPnPnO4G sstem3OpauseO4G BBinserarea elementului in coada int inJ3nod Hv4D elJ HcG c=3elJH4malloc3si/eof3elJ44G if3Qc4 return ,G if3Qfirst4D first = cG else D last!
else D first=c!
BBcrearea arborelui in coada int creatKJ34D int fG nod Hc(HpG first=last=ULLG printf3O'oriti sa creati radacina arborelui 3&B,4S #Pn O4G scanf3OdO(f4G if3f4D c=3nodH4malloc3si/eof3nod44G if3Qc4 return !&G printf3OPnIntroduceti datele #PnO4GP printf3O'enumirea # O4G scanf3OsO(c! !ul # O4G scanf3OfO(c! !ul # O4G scanf3OfO(c! !ul # O4G scanf3OfO(c!
BBAfisarea in coada int shoKJ34D nod Hp(HcG first=last=ULLG if3Qroot4 return ,G p=rootG if3QinJ3p44 return !+G printf3OLista %tatelorPnPnO4G hile3first4D p=delJ34G printf3O===================================== =============PnPnO4G printf3O'enumire sPnO(p! !ul .+fPnPnO(p!
"
c=p!!ul # O4G scanf3OfO(c!
printf3O9I>!ul # O4G scanf3OfO(c! !ul # O4G scanf3OfO(c! !ul .+fPnPnO(p!
-
nod Hp(HcG int s=,G top=ULLG if3Qroot4 return ,G p=rootG if3Qpush3p44 return !"G hile3top4D p=pop34G sVVG c=p!
fflush3stdin4G scanf3OdO(f4G if3f4D c=3nodH4malloc3si/eof3nod44G if3Qc4 return !&G printf3OPnIntroduceti datele #PnO4GP printf3O'enumirea # O4G scanf3OsO(c! !ul # O4G scanf3OfO(c! !ul # O4G scanf3OfO(c! !ul # O4G scanf3OfO(c!
@
printf3O===================================== =PnPnO4G printf3O'enumirea sPnO(c!!ul .+fPnPnO(c!
BBmarimea recursiv int si/eKr3nod Hc4D static int n=,G if3Qc4 return nG nVVG si/eKr3c!
BBcautarea recursiv nodH searchKr3nodH c( char Hfname4D nodH t=ULLG if3Qc4 return ULLG if 3Qstrcmp3c!
include Ofunct.cppO int main34D int comand(m=&(m&=,(m+=,(m:=,G nod Ht=ULLG char fname&,FG hile3&4D fflush3stdin4G hile3m4Dm=,G sstem3OclsO4G fflush3stdin4G printf3OPtPtCrearea arborelui #PnO4G
t=searchKr3c!
%isierul 2main3cpp
printf3OPtHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH HHHPnO4G printf3O PtPtW &.W Utili/ind coadaPnO4G printf3O PtPtW +.W Utili/ind stivaPnO4G printf3O PtPtW :.W Utili/ind functie recursivaPn O4G printf3O PtPtW ,.W E8itPn O4G printf3OPtHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH HHPnO4G printf3OComand << O4G fflush3stdin4G scanf3OdO(comand4G sstem3OclsO4G sitch3comand4D case ,# e8it3,4G breaXG case creatKJ34G breaXG case +# creatKs34G breaXG case :# creatKr34G breaXG default# printf3OPaPnAti introdus o comanda $resitaQPnO4G m=&G breaXG
breaXG sstem3OclsO4G fflush3stdin4G printf3OPtAle$eti modul de lucru #PnO4G printf3O &. CoadaPnO4G printf3O +. %tivaPnO4G printf3O :. RecursiePnO4G printf3O . Meniul de introducere a datelorPnO4G printf3O ,. E8itPnPnO4G printf3OComand << O4G scanf3OdO(comand4G sstem3OclsO4G sitch3comand4D case ,# e8it3,4G breaXG case m&=&G breaXG case +# m+=&G breaXG case :# m:=&G breaXG case # m=&G breaXG default# printf3OPaPnAti introdus o comanda $resitaQPnO4G breaXG hile3m&4D sstem3OclsO4G fflush3stdin4G printf3OPtPt9relucrarea arborelui binar folosind coadaQPnO4G printf3OPtPt=================================== ========PnO4G printf3O &. Afisarea informatiei despre nodurile arborelui PnO4G printf3O +. Cautarea nodului dupa denumirea statului PnO4G printf3O :. Marimea arboreluiPnO4G printf3O . Inaltimea arboreluiQPnO4G printf3O ". Eliberarea memorieiPnO4G printf3O -. Ale$e modul de lucruPnPnO4G printf3O ,. E8itPnPnO4G printf3OComand << O4G scanf3OdO(comand4G sstem3OclsO4G sitch3comand4D case ,# e8it3,4G breaXG case
shoKJ34G breaXG
else D
case +#
printf3Ou sa $asit nici un stat printf3OIntroduceti denumirea statului
cu asa numeQPaO4G
pentru cautare # O4G
breaXG fflush3stdin4G scanf3OsO(fname4G t=searchKJ3fname4G if3t4D
case :# printf3OArborele are noduri O4G findKerror3si/eKs344G breaXG case #
printf3O===================================== =PnPnO4G printf3O'enumire sPnO(t!!ul .+fPnO(t!!ul .+fPnO(t!
printf3OInaltimea arborelui este dO(hei$htKr3root44G breaXG case "#freememKs34G root=ULLG printf3OMemoria s!a eliberat cu succesQO4G breaXG case -# m+=,G breaXG default# printf3OPaPnAti introdus o comanda $resitaQPnO4G breaXG pause hile3m:4D sstem3OclsO4G fflush3stdin4G printf3OPtPt9relucrarea arborelui binar recursivQPnO4G printf3OPtPt=================================== ========PnO4G printf3O &. Afisarea informatiei despre nodurile arborelui PnO4G printf3O +. Cautarea nodului dupa denumirea statului PnO4G printf3O :. Marimea arboreluiPnO4G printf3O . Inaltimea arboreluiQPnO4G printf3O ". Eliberarea memorieiPnO4G printf3O -. Ale$e modul de lucruPnPnO4G printf3O ,. E8itPnPnO4G printf3OComand << O4G scanf3OdO(comand4G sstem3OclsO4G sitch3comand4D case ,# e8it3,4G breaXG case shoKr3root4G breaXG case +# printf3OIntroduceti denumirea statului pentru cautare # O4G fflush3stdin4G scanf3OsO(fname4G t=searchKr3root(fname4G if3t4D printf3O===================================== =PnPnO4G printf3O'enumire sPnO(t!!ul .+fPnO(t!
Y
default# printf3OPaPnAti introdus o comanda $resitaQPnO4G breaXG pause
return ,G
Rezultatele obtinute: eniu
odul de lucru
6tilizind coada
A*isarea
&,
1autarea
arimea arborelui
7naltimea arborelui
8liberarea memoriei
&&
1oncluzie &. Am obtinut deprinderi practice de implementare a unui tip de date abstract 3T'A4 in limba1ul C si anume a T'A Arbore binar0 utili/ind al$oritmi iterativi si recursivi.0
+. In urma acestei lucrari de laborator am a1uns la ideia ca e destul de usor de lucrat cu T'A Z Arbore binar ['easemenea verificarea re/ultatelor demonstrea/a ca valoariile primite sunt adevarate ceea ce arata ca pro$ramul lucrea/a . 9ibliogra*ie: •
•
T2TUL 'E%9RE C %I CVV 3MAUALUL 7U'AMETAL 'E 9R2\RAMARE I C %I CVV4R2F)ris ]amsaFLars )landF http#BB.scribd.comBdocB&+Y:+Be$rescu!Liviu!Limba1ele!C!si!C! pentru!incepatori!vol!&
&+