al Republicii Moldova
Universitatea Tehnică a Moldovei
RAPORT
Chișinău, 2021
Теmа: Algoritmi de prelucrare a tipului abstract de date „Arbori
binari”
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.
Fișier function.c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "arbore.h"
Cinematograf* delq(){
elq *c=first;
Cinematograf *x;
if(c == last){
first=last=NULL;
} else {
first=c->next;
}
x=c->adrCinematograf;
free(c);
return x;
}
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;
}
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("cls");
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: