Sunteți pe pagina 1din 14

Ministerul Educației, Culturii, și Cercetării

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică

Raport
Lucrarea de laborator Nr.6
la Structuri de date și algoritmi

Studentul: Cepraga Cătălin Grupa: TI-205


Profesorul: Mititelu Vitalie Localitatea: Chișinău

Chișinău - 2021
Теmа: Algoritmi de prelucrare a tipului abstract de date „Arbori
binari”

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 recursivă a nodurilor arboreluifolosind algoritmi recursivisau
structurile respective de date „coadă” și „stivă”.

Sarcina :
Să se scrie 3 fișiere-text în limbajul C pentru implementarea și utilizarea TAD
„Arbore binar” cu asigurarea operațiilor de prelucrare de bază alearborilor
binari oarecareprin parcurgerea nodurilor arborelui cu ajutorul
algoritmilorrecursivi sau iterativi:
1. Fișier antet cu extensia .h,care conține specificarea structurii de date a
nodului arborelui binar (conform variantelor) și prototipurile funcțiilor
de prelucrare de bază ale arborilor binari.
2. Fișier cu extensia .c sau .cpp, care conține implementările (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 de
bază:
1.Crearea nodurilor arborelui binar oarecare în memoria dinamică și
introducerea informației despre nodurile arborelui de la tastatură
înmod interactiv.
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
listă. 0.Ieșire din program.

Sarcina conform variantei :


Program:
Fișier arbore.h
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Cinematograf{
char denumirea[100];
char adresa[100];
int telefon;
int locuri;
int pret;
struct Cinematograf *left;
struct Cinematograf *right;
}Cinematograf;
Cinematograf *root=NULL;
// Coada
typedef struct elq{
Cinematograf *adrCinematograf;
struct elq *next;
}elq;
elq *first=NULL;
elq *last=NULL;
// Stiva
typedef struct els{
Cinematograf *adrCinematograf;
struct els* prev;
}els;
els *top=NULL;
int inq(Cinematograf *inf);
Cinematograf* delq();
int push(Cinematograf *inf);
Cinematograf* pop();
int create_q();
int creat_s();
int show_q();
int show_s();
Cinematograf* search_q(char *fname);
Cinematograf* search_s(char *fname);
Cinematograf* search_rsd(Cinematograf* c, char *fname);
int size_q();
int size_s();
int freemem_q();
int freemem_s();

Fișier function.c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "arbore.h"

int inq(Cinematograf *x){


elq *c;
c=(elq*)malloc(sizeof(elq));
if(!c) return 0; if(!
first){
first = c;
} else {
last->next=c;
}
last=c;
c->next=NULL;
c->adrCinematograf=x;
return 1;
}

Cinematograf* delq(){
elq *c=first;
Cinematograf *x;
if(c == last){
first=last=NULL;
} else {
first=c->next;
}
x=c->adrCinematograf;
free(c);
return x;
}

int push(Cinematograf *x){


els *c;
c=(els*)malloc(sizeof(els));
if(!c) return 0;
c->prev=top;
c->adrCinematograf=x;
top=c;
return 1;
}

Cinematograf* pop(){
els *c=top;
Cinematograf *x;
top=c->prev;
x=c->adrCinematograf;
free(c);
return x;
}

int create_q(){
int f;
Cinematograf *c,*p;
first=last=NULL;
printf(" Doriti sa creati radacina arborelui [1/0] ? : ");
scanf("%d",&f);
if(f){
c=(Cinematograf*)malloc(sizeof(Cinematograf));
if(!c) return -1;
printf(" Introduceti datele radacinei \n");
printf("\n--- Introduceti datele ---\n");
printf("Denumirea : ");
scanf("%s",&c->denumirea);
printf("Adresa : ");
scanf("%s",&c->adresa);
printf("Telefon : ");
scanf("%d",&c->telefon);
printf("Locuri : ");
scanf("%d",&c->locuri);
printf("Pret : ");
scanf("%d",&c->pret);
if(!inq(c)) return -2;
root = c;
}else {
root = NULL;
}
while(first){
p = delq();
printf(" Doriti sa creati nodul stang al nodului %s [1/0]?: ",p->denumirea);
scanf("%d",&f);
if(f){
c=(Cinematograf*)malloc(sizeof(Cinematograf));
if(!c) return -3;
printf(" Introduceti datele nodului stang\n");
printf("\n--- Introduceti datele ---\n");
printf("Denumirea : ");
scanf("%s",&c->denumirea);
printf("Adresa : ");
scanf("%s",&c->adresa);
printf("Telefon : ");
scanf("%d",&c->telefon);
printf("Locuri : ");
scanf("%d",&c->locuri);
printf("Pret : ");
scanf("%d",&c->pret);
p->left=c;
if(!inq(c)) return -2;
} else {
p->left=NULL;
}
printf(" Doriti sa creati nodul drept al nodului %s [1/0]?: ",p->denumirea);
scanf("%d",&f);
if(f){
c=(Cinematograf*)malloc(sizeof(Cinematograf));
if(!c) return -3;
printf(" Introduceti datele nodului drept\n");
printf("\n--- Introduceti datele ---\n");
printf("Denumirea : ");
scanf("%s",&c->denumirea);
printf("Adresa : ");
scanf("%d",&c->adresa);
printf("Telefon : ");
scanf("%d",&c->telefon);
printf("Locuri : ");
scanf("%d",&c->locuri);
printf("Pret : ");
scanf("%d",&c->pret);
p->right = c;
if(!inq(c)) return -2;
} else {
p->right = NULL;
}
}
return 1;
}

int show_q(){
Cinematograf *p,*c;
first=last=NULL;
if(!root) return 0;
p=root;
if(!inq(p)) return -2;
printf(" Lista Cinematografelor\n\n");
while(first){
p=delq();
printf("++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");
printf("Denumirea----------%s\n",p->denumirea);
printf("Adresa-------------%s\n",p->adresa);
printf("Telefon------------%d\n",p->telefon);
printf("Locuri-------------%d\n",p->locuri);
printf("Pret---------------%d\n\n",p->pret);
c=p->left;
if(c){
if(!inq(c)) return -2;
}
c=p->right;
if(c){
if(!inq(c)) return -2;
}
}
return 1;
}
Cinematograf* search_q(char *fname){
Cinematograf *p,*c;
first=last=NULL;
if(!root) return NULL;
p=root;
if(!inq(p)) return NULL;
while(first){
p=delq();
if(!strcmp(p->denumirea,fname)) return p;
c=p->left;
if(c){
if(!inq(c)) return NULL;
}
c=p->right;
if(c){
if(!inq(c)) return NULL;
}
}
return NULL;
}

int size_q(){
int s=0;
Cinematograf *p,*c;
first=last=NULL;
if(!root) return 0;
p=root;
if(!inq(p)) return -2;
while(first){
p=delq();
s++;
c=p->left;
if(c){
if(!inq(c)) return -2;
}
c=p->right;
if(c){
if(!inq(c)) return -2;
}
}
return s;
}

int freemem_q(){
Cinematograf *p,*c;
first=last=NULL;
if(!root) return 0;
p=root;
if(!inq(p)) return -2;
while(first){
p=delq();
c=p->left;
if(c){
if(!inq(c)) return -2;
}
c=p->right;
if(c){
if(!inq(c)) return -2;
}
free(p);
}
return 1;
}
int height_q(Cinematograf *c){
int l=0,r=0;
if(!c) return -1;
l=1+height_q(c->left);
r=1+height_q(c->right);
if(l>r) return l;
else return r;
}

int creat_s(){
Cinematograf *p, *c;
int f;
root=NULL;
top=NULL;
printf(" Doriti sa creati radacina arborelui [1/0]? : ");
fflush(stdin);
scanf("%d",&f);
if(f){
c=(Cinematograf*)malloc(sizeof(Cinematograf));
if(!c) return -1;
printf("--- Introduceti datele --- \n");
printf("Denumirea : ");
scanf("%s",&c->denumirea);
printf("Adresa : ");
scanf("%d",&c->adresa);
printf("Telefon : ");
scanf("%d",&c->telefon);
printf("Locuri : ");
scanf("%d",&c->locuri);
printf("Pret : ");
scanf("%d",&c->pret);
if(!push(c)) return -5;
root=c;
while(top){
p=pop();
printf(" Doriti sa creati nodul drept al nodului-> %s [1/0]?: ",p->denumirea);
fflush(stdin);
scanf("%d",&f);
if(f){
c=(Cinematograf*)malloc(sizeof(Cinematograf));
if(!c) return -3;
printf(" Introduceti datele\n");
printf("Denumirea : ");
scanf("%s",&c->denumirea);
printf("Adresa : ");
scanf("%d",&c->adresa);
printf("Telefon : ");
scanf("%d",&c->telefon);
printf("Locuri : ");
scanf("%d",&c->locuri);
printf("Pret : ");
scanf("%d",&c->pret);
p->right = c; if(!
push(c)) return -5;
} else {
p->right = NULL;
}
printf(" Doriti sa creati nodul stang al nodului %s [1/0]?: ",p->denumirea);
fflush(stdin);
scanf("%d",&f);
if(f){
c=(Cinematograf*)malloc(sizeof(Cinematograf));
if(!c) return -3;
printf(" Introduceti datele\n");
printf("Denumirea : ");
scanf("%s",&c->denumirea);
printf("Adresa : ");
scanf("%d",&c->adresa);
printf("Telefon : ");
scanf("%d",&c->telefon);
printf("Locuri : ");
scanf("%d",&c->locuri);
printf("Pret : ");
scanf("%d",&c->pret);
p->left=c;
if(!push(c)) return -5;
} else {
p->left=NULL;
}
}
}
return 1;
}

int show_s(){
Cinematograf *p,*c;
top=NULL;
if(!root) return 0;
p=root;
if(!push(p)) return -5;
printf("Lista Cinematografelor\n\n");
while(top){
p=pop();
printf("++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");
printf("Denumirea----------%s\n",p->denumirea);
printf("Adresa-------------%s\n",p->adresa);
printf("Telefon------------%d\n",p->telefon);
printf("Locuri-------------%d\n",p->locuri);
printf("Pret---------------%d\n\n",p->pret);
c=p->right;
if(c!=NULL){
if(!push(c)) return -5;
}
c=p->left;
if(c!=NULL){
if(!push(c)) return -5;
}
}
printf("\n");
return 1;
}

int size_s(){
Cinematograf *p,*c;
int s=0;
top=NULL;
if(!root) return 0;
p=root;
if(!push(p)) return -5;
while(top){
p=pop(); s++;
c=p->right;
if(c!=NULL){
if(!push(c)) return -5;
}
c=p->left;
if(c!=NULL){
if(!push(c)) return -5;
}
}
return s;
}

Cinematograf* search_s(char *fname){


Cinematograf *p,*c;
top=NULL;
if(!root) return NULL;
p=root;
if(!push(p)) return NULL;
while(top){
p=pop();
if(!strcmp(fname,p->denumirea)) return p;
c=p->right;
if(c!=NULL){
if(!push(c)) return NULL;
}
c=p->left;
if(c!=NULL){
if(!push(c)) return NULL;
}
}
return NULL;
}

int freemem_s(){
Cinematograf *p,*c;
top=NULL;
if(!root) return 0;
p=root;
if(!push(p)) return -5;
while(top){
p=pop();
c=p->right;
if(c!=NULL){
if(!push(c)) return -5;
}
c=p->left;
if(c!=NULL){
if(!push(c)) return -5;
}
free(p);
}
return 1;
}
int height_s(Cinematograf *c){
int l=0,r=0;
if(!c) return -1;
l=1+height_s(c->left);
r=1+height_s(c->right);
if(l>r) return l;
else return r;
}

Fișier main.c
#include <stdio.h>
#include <stdlib.h>
#include "function.c"
int main()
{
system("Color 02");
Cinematograf *t=NULL;
char fname[100];
int meniu=0;
do{ system("cl
s");
printf(" ++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");
printf(" TEMA:Algoritmi de prelucrare a tipurilor de date\n *Arbori binari*\n\n");
printf(" <=== 1. COADA === > \n");
printf(" 1. Crearea arborelui \n");
printf(" 2. Afisarea arborelui \n");
printf(" 3. Cautarea unui nod \n");
printf(" 4. Marimea arborelui \n");
printf(" 5. Inaltimea arborelui \n");
printf(" 6. Eliberarea memoriei \n\n");
printf(" <=== 2. STIVA ===> \n");
printf(" 7. Crearea arborelui \n");
printf(" 8. Afisarea arborelui \n");
printf(" 9. Cautarea unui nod \n");
printf(" 10. Marimea arborelui \n");
printf(" 11. Inaltimea arborelui \n");
printf(" 12. Eliberarea memoriei \n\n");
printf(" <=== IESIREA DIN PROGRAM ===> \n");
printf(" 0. Iesire \n");
printf(" ++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");
printf("\n Alegeti optiunea: ");
scanf("%d",&meniu);
switch (meniu){
case 1: {
create_q();
system("PAUSE");
break;
}
case 2: {
show_q();
system("PAUSE");
break;
}
case 3: {
printf(" Introduceti numele care trebuie cautat: ");
fflush(stdin);
scanf("%s",&fname);
t=search_q(fname);
if(t){
printf(" --- Nodul %s ---\n",t->denumirea);
printf("Denumirea----------%s\n",t->denumirea);
printf("Adresa ------------ %s\n",t->adresa );
printf("Telefon------------%d\n",t->telefon);
printf("Locuri ------------ %d\n",t->locuri );
printf("Pret---------------%d\n\n",t->pret);
} else {
printf(" Nu exista asa nume!\n");}
system("PAUSE");
break;
}
case 4: {
printf(" Nodurile arborelui = %d\n",size_q());
system("PAUSE");
break;
}
case 5: {
printf(" Inaltimea arborelui este %d \n", height_q(root));
system("PAUSE");
break;
}

case 6: {
freemem_q();
root=NULL;
printf(" Eliberarea memoriei a avut loc cu succes!\n");
system("PAUSE");
break;
}
case 7: {
creat_s();
system("PAUSE");
break;
}
case 8: {
show_s();
system("PAUSE");
break;
}
case 9: {
printf(" Introduceti numele dare trebuie cautat: ");
fflush(stdin);
scanf("%s",&fname);
t=search_s(fname);
if(t){
printf(" --- Nodul %s ---\n",t->denumirea);
printf("Denumirea----------%s\n",t->denumirea);
printf("Adresa-------------%d\n",t->adresa);
printf("Telefon------------%d\n",t->telefon);
printf("Locuri-------------%d\n",t->locuri);
printf("Pret---------------%d\n\n",t->pret);
} else {
printf(" Nu exista asa nume!\n");}
system("PAUSE");
break;
}
case 10: {
printf(" Nodurile arborelui = %d\n",size_s());
system("PAUSE");
break;
}
case 11: {
printf(" Inaltimea arborelui este %d \n", height_s(root));
system("PAUSE");
break;
}
case 12: {
freemem_s();
root=NULL;
printf(" Eliberarea memoriei a avut loc cu succes!\n");
system("PAUSE");
break;
}
case 0:{
printf(" O zi buna\n ENTER\n");
return 0;
}
default:{
printf(" Optiunea nu exista!\n");
break;
}
}
}
while(meniu!=0);
getch();
return 0;
}
Rezultatul rulării programului
Concluzie:

Efectuând lucrarea de laborator nr.6, am studiat tema : ,,Algoritmi de


prelucrare a tipului abstract de date „Arbori binari”,având ca scop 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 recursivă a nodurilor
arborelui folosind algoritmi recursivi sau structurile respective de date
„coadă” și „stivă”.
Pe parcursul lucrarii am reușit să asimilez cunoștinte referitor
arborilor binari, , termenul de arbore fiind folosit pentru a desemna o
structură de date, însă are asociate un nod rădăcină şi o orientare înspre sau
opusă rădăcinii. Arborii sunt folosiţi în general pentru a modela o ierarhie de
elemente.
Sarcina propunea scrierea a 3 fișiere-text în limbajul C pentru
implementarea și utilizarea TAD „Arbore binar” cu asigurarea operațiilor
de prelucrare de bază ale arborilor binari oarecare prin parcurgerea
nodurilor arborelui cu ajutorul algoritmilor recursivi sau iterative, ulterior
urmand niste pasi specifici. În urma dovezilor, verificarea demonstrează că
rezultatele obținute sunt veridice și corecte, iar programul lucrează conform
sarcinii variantei de lucru.

S-ar putea să vă placă și