RAPORT
Lucrarea de laborator nr. 5
La Structuri de Date și Algoritmi
A efectuat:
st. gr. CR-211 Bivol Vasile
A verificat:
dr., conf. univ. Mihail Kulev
Chişinău -2022
Lucrare de Laborator nr 5
Tema:
Implementarea tipului abstract de date „Arbore binar”. Utilizarea algoritmilor iterativi
Scopul lucrării:
Obţinerea deprinderilor practice de implementare și de utilizare a tipului abstract de date (TAD)
„Arbore binar” cu asigurarea operațiilor de prelucrare de bază ale arborelui binar oarecare prin
parcurgerea nodurilor arborelui “în lăţime” şi “în adâncime”, folosind structurile respective de
date “coadă” şi “stivă”.
Condiţia problemei (sarcina de lucru):
Să se scrie trei fişiere-text în limbajul C pentru implementarea și utilizarea TAD „Arbore binar”
cu asigurarea operațiilor de prelucrare de bază ale arborelui binar oarecare prin parcurgerea
nodurilor arborelui cu ajutorul algoritmilor iterativi:
1. Fişier antet cu extensia .h, care conține specificarea structurii de date a nodului arborelui
binar (conform variantelor) şi a structurilor de date ale elementelor cozii și stivei, precum și
prototipurile funcţiilor de prelucrare ale arborelui binar oarecare, bazate pe algoritmi iterativi.
2. Fişier cu extensia .cpp sau .c, care conține implementările funcţiilor (codurile funcţiilor),
declarate în fişierul antet.
3. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea arborelui binar oarecare cu afişarea
la ecran a următorului meniu de opţiuni:
1. Crearea nodurilor arborelui binar oarecare în memoria dinamică și introducerea informaţiei
despre nodurile arborelui de la tastatură în mod interactive.
2. Afişarea informaţiei despre nodurile arborelui la ecran.
3. Căutarea nodului în arbore.
4. Modificarea informației unui nod din arbore.
5. Determinarea numărului de noduri.
6. Determinarea înălţimii arborelui.
7. Eliberarea memoriei alocate pentru arbore.
0. Ieşirea din program.
Varianta :
3. Structura Hotel cu câmpurile: denumirea, adresa, telefonul, categoria, numărul de
locuri.
Mersul lucrării:
Descrierea variabilelor:
1)Fișiere:
Hotele-header.h – fișier de tip header
Hotele-functii.c – fișier de tip C
Hotele-main.c – fișier de tip C
2)Date de intrare:
nume[40], strada[40], telefon[40], , spec[40] – variabile de tip char. (De introdus de
la tastatură de către utilizator).
locuri, numarul de ordine – variabile de tip integer. . (De introdus de la tastatură de către
utilizator).
3) date de ieşire:
nume[40], strada[40], telefon[40], spec[40] – variabile de tip char.
locuri, numarul de ordine – variabilă de tip integer.
4) date de lucru:
n, c, v, e1, e2 – variabilă de tip integer.
Lab11 Head.h
typedef struct Hotel
{
char denumire[50];
char adresa[50];
char telefonul[50];
char categoria[50];
int locuri;
char specializare[50];
struct Hotel* left;
struct Hotel* right;
}Hotel;
Hotel* root;
Hotel *create_recursiv();
void show_recursiv_RSD(Hotel *c);
void show_recursiv_SRD(Hotel *c);
void show_recursiv_SDR(Hotel *c);
void show_recursiv_DRS(Hotel *c);
void show_recursiv_DSR(Hotel *c);
Lab11 Functii.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"11_head.h"
Hotel *create_recursiv()
{
int f;
Hotel *c;
c = (Hotel*)malloc(sizeof(Hotel));
if(!c)
{
return NULL;
}
printf(" Doriti sa creati copilul S_tang al Hotelului %s ? (1-DA / 0-NU): ", c->denumire);
scanf("%d",&f);
if(f == 1)
{
c->left = create_recursiv();
}
else
{
c->left = NULL;
}
return c;
}
//preordine
void show_recursiv_RSD(Hotel *c)
{
if(c)
{
printf("Denumirea: %s\n",c->denumire);
printf("Adresa: %s\n", c->adresa);
printf("Telefonul: %s\n", c->telefonul);
printf("Categoria: %s\n", c->categoria);
printf("Nr.locuri: %d\n", c->locuri);
printf("Specializare: %s\n", c->specializare);
printf("Adresa elementului curent: %p\n", c);
printf("Adresa copilului stang: %p\n", c->left);
printf("Adresa copilului drept: %p\n", c->right);
printf("\n\n");
show_recursiv_RSD(c->left);
show_recursiv_RSD(c->right);
}
return;
}
//inordine
void show_recursiv_SRD(Hotel *c)
{
if(c)
{
show_recursiv_SRD(c->left);
printf("Denumirea: %s\n",c->denumire);
printf("Adresa: %s\n", c->adresa);
printf("Telefonul: %s\n", c->telefonul);
printf("Categoria: %s\n", c->categoria);
printf("Nr.locuri: %d\n", c->locuri);
printf("Specializare: %s\n", c->specializare);
printf("Adresa elementului curent: %p\n", c);
printf("Adresa copilului stang: %p\n", c->left);
printf("Adresa copilului drept: %p\n", c->right);
printf("\n\n");
show_recursiv_SRD(c->right);
}
return;
}
//postordine
void show_recursiv_SDR(Hotel *c)
{
if(c)
{
show_recursiv_SDR(c->left);
show_recursiv_SDR(c->right);
printf("Denumirea: %s\n",c->denumire);
printf("Adresa: %s\n", c->adresa);
printf("Telefonul: %s\n", c->telefonul);
printf("Categoria: %s\n", c->categoria);
printf("Nr.locuri: %d\n", c->locuri);
printf("Specializare: %s\n", c->specializare);
printf("Adresa elementului curent: %p\n", c);
printf("Adresa copilului stang: %p\n", c->left);
printf("Adresa copilului drept: %p\n", c->right);
printf("\n\n");
}
return;
}
show_recursiv_DRS(c->left);
}
return;
}
printf("Denumirea: %s\n",c->denumire);
printf("Adresa: %s\n", c->adresa);
printf("Telefonul: %s\n", c->telefonul);
printf("Categoria: %s\n", c->categoria);
printf("Nr.locuri: %d\n", c->locuri);
printf("Specializare: %s\n", c->specializare);
printf("Adresa elementului curent: %p\n", c);
printf("Adresa copilului stang: %p\n", c->left);
printf("Adresa copilului drept: %p\n", c->right);
printf("\n\n");
}
return;
}
if(!c)
{
return NULL;
}
if(strcmp(c->denumire,name) == 0)
{
return c;
}
p = search_recursiv(c->left, name);
if(p)
{
return p;
}
p = search_recursiv(c->right, name);
if(p)
{
return p;
}
return NULL;
}
if(!c)
{
return 0;
}
k = Hoteles_count_recursiv(c->left) + 1 + Hoteles_count_recursiv(c->right);
return k;
}
l = height_recursiv(c->left);
r = height_recursiv(c->right);
if(l > r)
{
return(l + 1);
}
else
{
return(r + 1);
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"11_functions.c"
int main()
{
int nm, x, f, k, h;
Hotel *c;
char name[50];
puts("\n\t Menu:");
puts("1. Crearea Hotelurilor arborelui binar");
puts("2. Afisarea informatiei despre Hotelurile arborelui la ecran");
puts("3. Cautarea Hotelului in arbore");
puts("4. Modificarea informatiei unui Hotel din arbore");
puts("5. Determinarea numarului de Hoteluri");
puts("6. Determinarea inaltimii arborelui");
puts("7. Eliberarea memoriei alocate pentru arbore ");
puts("0. Iesire din program");
while(1)
{
printf("\n\t Optiunea:");
scanf("%d", &nm);
switch(nm)
{
case 1:
{
root = NULL;
printf("Introdu informatia despre radacina: \n\n");
root = create_recursiv();
break;
}
case 2:
{
printf("Alege optiunea de afisare:\n\n");
printf("1.Preordine(RSD) \n");
printf("2.Inordine(SRD) \n");
printf("3.Postordine(SDR) \n");
printf("4.(DRS) \n");
printf("5.(DSR) \n");
x=1;
while(x>0)
{
if(x==1)
{
show_recursiv_RSD(root);
}
else if(x==2)
{
show_recursiv_SRD(root);
}
else if(x==3)
{
show_recursiv_SDR(root);
}
else if(x==4)
{
show_recursiv_DRS(root);
}
else if(x==5)
{
show_recursiv_DSR(root);
}
else {
break;
}
}
break;
}
case 3:
{
printf("Introdu denumirea Hotelului: ");
fflush(stdin);
gets(name);
c = search_recursiv(root,name);
if(c)
{
printf("Denumirea: %s\n",c->denumire);
printf("Adresa: %s\n", c->adresa);
printf("Telefonul: %s\n", c->telefonul);
f = modify(c);
if(f)
{
puts("Hotelul a fost modificat ");
}
else
{
puts("Hotelul nu a fost
modificat");
}
}
else
{
puts("Hotelul nu a fost gasit");
}
break;
}
case 5:
{
k = Hoteles_count_recursiv(root);
if(k == 0)
{
puts("Eroare in determinarea
numarului de Hoteluri");
}
else
{
printf("Numarul de Hoteluri in
arbore : %d",k);
}
break;
}
case 6:
{
if(root)
{
h = height_recursiv(root);
printf("Inaltimea arborelui: %d",h);
}
else
{
printf("Radacina nu exista");
}
break;
}
case 7:
{
free_recursiv(root);
break;
}
case 0:
{
exit(1);
}
default :
{
puts("Optiune gresita !");
break;
}
}
}
return 0;
}
Rezultatele testării și funcţionării programului:
Analiza rezultatelor și concluzii:
1. Programul dat a avut o strcutură asemănătoare cu cel din lucrarea de laborator trecută,
ceea ce a permis iar împărțirea codului în trei părți și economisirea locului.
2. Mulțumită implementării header-ului și a funcțiilor în main a fost posibilă folosirea unui
document cu mult mai scurt, comparative cu cel din laboratorul numărul 6.
Bibliografie:
1. https://else.fcim.utm.md/mod/assign/view.php?id=32769
2. https://else.fcim.utm.md/course/view.php?id=379
3. https://www.coursehero.com/file/p4l8ln5q/%C8%99i-de-utilizare-a-tipului-abstract-
de-date-TAD-Arbore-binar-cu-asigurarea/
4. http://repository.utm.md/bitstream/handle/5014/15229/
ProgramareaCalculatoarelor_StructuriDateAlgoritmi_C_DS.pdf?sequence=1
5. http://www.cs.ubbcluj.ro/~gabis/fp/Documentatii/TAD.pdf
6. https://else.fcim.utm.md/mod/assign/view.php?id=32768