Sunteți pe pagina 1din 34

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică şi Microelectronică

Paduraru Vadim
CR - 192

Raport
pentru lucrarea de laborator Nr.10/11

la cursul de “SDA
Теmа: I Implementarea tipului abstract de date
„Arbore binar”. Utilizarea algoritmilor iterativi
/ Implementarea tipului abstract de date
„Arbore binar”. Utilizarea algoritmilor
recursivi

Verificat:
M. Kulev
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 arborelui, folosind algoritmi recursivi.

Sarcină: 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 recursivi:

MAIN:
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "imobil.h"

#define pause printf("\n\n"); system("pause");

int main(){

int comand,m=1,m1=0,m2=0,m3=0;

nod *t=NULL;

char fname[10];

while(1){

fflush(stdin);

while(m)

m=0;

system("cls");

fflush(stdin);
printf("\t\tCrearea arborelui :\n");

printf("\t*******************************************\n");

printf(" \t\t| 1.| Utilizind coada\n");

printf(" \t\t| 2.| Utilizind stiva\n");

printf(" \t\t| 3.| Utilizind algoritm recursiv\n ");

printf(" \t\t| 0.| Exit\n ");

printf("\t******************************************\n");

printf("Comanda >> ");

fflush(stdin);

scanf("%d",&comand);

system("cls");

switch(comand){

case 0: exit(0); break;

case 1: creat_q(); break;

case 2: creat_s(); break;

case 3: creat_r(); break;

default:

printf("\a\nAti introdus o comanda gresita!\n");

m=1;

break;

break;

system("cls"); fflush(stdin);

printf("\tAlegeti modul de lucru :\n");

printf(" 1. Coada\n");

printf(" 2. Stiva\n");

printf(" 3. Recursie\n");
printf(" 4. Meniul de introducere a datelor\n");

printf(" 0. Exit\n\n");

printf("Comand >> ");

scanf("%d",&comand);

system("cls");

switch(comand){

case 0: exit(0); break;

case 1: m1=1; break;

case 2: m2=1; break;

case 3: m3=1; break;

case 4: m=1; break;

default: printf("\a\nAti introdus o comanda gresita!\n");

break;

while(m1){

system("cls");

fflush(stdin);

printf("\t\tPrelucrarea arborelui binar folosind coada!\n");

printf("\t\t===========================================\n");

printf(" 1. Afisarea informatiei despre nodurile arborelui \n");

printf(" 2. Cautarea nodului dupa denumirea Imobilului \n");

printf(" 3. Marimea arborelui\n");

printf(" 4. Inaltimea arborelui!\n");

printf(" 5. Eliberarea memoriei\n");

printf(" 6. Alege modul de lucru\n\n");

printf(" 0. Exit\n\n");

printf("Comand >> ");


scanf("%d",&comand);

system("cls");

switch(comand){

case 0: exit(0); break;

case 1:

show_q(); break;

case 2:

printf("Introduceti denumirea Imobilului pentru cautare : ");

fflush(stdin); scanf("%s",&fname);

t=search_q(fname);

if(t){

printf("======================================\n\n");

printf("Proprietarul %s\n",t->proprietarul);

printf("Tipul %s\n",t->Tipul);

printf("adresa %s\n",t->adresa);

printf("suprafata %s\n",t->suprafata);

printf("costul %d\n",t->costul );

} else {

printf("Nu sa gasit nici un imobil cu asa nume!\a");

} break;

case 3:

printf("Numarul de noduri a arborrlui \n");

printf("%d\n", size_q());

break;

case 4:

printf("Inaltimea arborelui este %d",height_r(root));

break;

case 5:
freemem_q(); root=NULL;

printf("Memoria s-a eliberat cu succes!");

break;

case 6: m1=0; break;

default: printf("\a\nAti introdus o comanda gresita!\n"); break;

} pause;

while(m2){ system("cls"); fflush(stdin);

printf("\t\tPrelucrarea arborelui binar folosind stiva!\n");

printf("\t\t===========================================\n");

printf(" 1. Afisarea informatiei despre nodurile arborelui \n");

printf(" 2. Cautarea nodului dupa denumirea imobilului \n");

printf(" 3. Marimea arborelui\n");

printf(" 4. Inaltimea arborelui!\n");

printf(" 5. Eliberarea memoriei\n");

printf(" 6. Alege modul de lucru\n\n");

printf(" 0. Exit\n\n");

printf("Comand >> ");

scanf("%d",&comand);

system("cls");

switch(comand){

case 0: exit(0); break;

case 1:

show_s(); break;

case 2:

printf("Introduceti denumirea imobilului pentru cautare : \n");

fflush(stdin); scanf("%s",&fname);

t=search_s(fname);
if(t){

printf("======================================\n\n");

printf("Proprietarul %s\n",t->proprietarul);

printf("Tipul %s\n",t->Tipul);

printf("adresa %s\n",t->adresa);

printf("suprafata %s\n",t->suprafata);

printf("costul %d\n",t->costul );

} else {

printf("Nu sa gasit nici un imobil cu asa nume!\a");

} break;

case 3:

printf("Numarul de noduri a arborrlui \n");

printf("%d\n", size_q());

break;

case 4:

printf("Inaltimea arborelui este %d",height_r(root));

break;

case 5:freemem_s(); root=NULL;

printf("Memoria s-a eliberat cu succes!");

break;

case 6: m2=0; break;

default: printf("\a\nAti introdus o comanda gresita!\n"); break;

} pause;

while(m3){ system("cls"); fflush(stdin);

printf("\t\tPrelucrarea arborelui binar recursiv!\n");

printf("\t\t===========================================\n");

printf(" 1. RSD\n");
printf(" 2. Cautarea nodului dupa denumirea Imobilului \n");

printf(" 3. Marimea arborelui\n");

printf(" 4. Inaltimea arborelui!\n");

printf(" 5. Eliberarea memoriei\n");

printf(" 6. Alege modul de lucru\n");

printf(" 7. SRD\n");

printf(" 8. SRD\n");

printf(" 9. RDS\n");

printf("10. DRS\n");

printf("11. DRS\n");

printf(" 0. Exit\n\n");

printf("Comand >> ");

scanf("%d",&comand);

system("cls");

switch(comand){

case 0:

exit(0);

break;

case 1:

printf("RSD\n\n");

show_r(root); break;

case 2:

printf("Introduceti proprietarul pentru cautare : ");

fflush(stdin); scanf("%s",&fname);

t=search_r(root,fname);

if(t){

printf("======================================\n\n");

printf("Proprietarul %s\n",t->proprietarul);
printf("Tipul %s\n",t->Tipul);

printf("adresa %s\n",t->adresa);

printf("suprafata %s\n",t->suprafata);

printf("costul %d\n",t->costul );

} else {

printf("Nu sa gasit nici un imobil cu asa nume!\a");

} break;

case 3:

printf("Numarul de noduri a arborrlui \n");

printf("%d\n", size_q());

break;

case 4:

printf("Inaltimea arborelui este %d",height_r(root));

break;

case 5:

freemem_r(root); root=NULL;

printf("Eliberarea memoriei a avut loc cu succes!\a");

break;

case 6: m3=0; break;

case 7:

printf("SRD\n\n");

show_SRD(root);

break;

case 8:

printf("SDR\n\n");

show_SDR(root);

break;

case 9:
printf("RDS\n\n");

show_RDS(root); break;

case 10: printf("DRS\n\n");

show_DRS(root); break;

case 11: printf("DSR\n\n");

show_DSR(root); break;

default: printf("\a\nAti introdus o comanda gresita!\n"); break;

} pause;

return 0;

Functii.c
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "imobil.h"

#define pause printf("\n\n"); system("pause");

//inserarea elementului in coada

int inq(nod *v){

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->adrnod=v;

return 1;

//stergerea elementului din coada

nod* delq(){

elq *c=first;

nod *v;

if(c == last){

first=last=NULL;

} else {

first=c->next;

v=c->adrnod;

free(c);

return v;

//inserarea elementului in stiva


int push(nod *v){

els *c;

c=(els*)malloc(sizeof(els));

if(!c) return 0;

c->prev=top;

c->adrnod=v;

top=c;

return 1;

//stergerea elementului din stiva

nod* pop(){

els *c=top;

nod *v;

top=c->prev;

v=c->adrnod;

free(c);

return v;

//crearea arborelui in coada

int creat_q(){

int f;

nod *c,*p;

first=last=NULL;

printf("Doriti sa creati radacina arborelui (1/0)? :\n ");

scanf("%d",&f);

if(f){
c=(nod*)malloc(sizeof(nod));

if(!c) return -1;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

if(!inq(c)) return -2;

root = c;

while(first){

p = delq();

printf("Doriti sa creati fiul sting al nodului %s (1/0)? : \n",p->proprietarul);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -3;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

p->left=c;

if(!inq(c)) return -2;

} else {
p->left=NULL;

printf("De creat fiul drept al nodului %s (1/0)? : \n",p->proprietarul);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -3;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );

p->right = c;

if(!inq(c)) return -2;

} else {

p->right = NULL;

return 1;

//Afisarea in coada

int show_q(){

nod *p,*c;

first=last=NULL;

if(!root) return 0;

p=root;
if(!inq(p)) return -2;

printf("Lista Disciplinelor\n\n");

while(first){

p=delq();

printf("==================================================\n\n");

printf("Proprietarul %s\n",p->proprietarul);

printf("Tipul %s\n",p->Tipul);

printf("adresa %s\n",p->adresa);

printf("suprafata %s\n",p->suprafata);

printf("costul %d\n",p->costul );

printf("Adresa elementului curent %p\n",p);

printf("Adresa fiului drept %p\n",p->right);

printf("Adresa fiului sting %p\n",p->left);

c=p->left;

if(c){

if(!inq(c)) return -2;

c=p->right;

if(c){

if(!inq(c)) return -2;

pause

return 1;

//cautarea in coada

nod* search_q(char *fname){


nod *p,*c;

first=last=NULL;

if(!root) return NULL;

p=root;

if(!inq(p)) return NULL;

while(first){

p=delq();

if(!strcmp(p->proprietarul,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;

//marimea in coada

int size_q(){

int s=0;

nod *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;

//eliberarea memoriei in coada

int freemem_q(){

nod *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;

//crearea arborelui in stiva

int creat_s(){

nod *p, *c;

int f;

root=NULL;

top=NULL;

printf("Doriti sa creati radacina arborelui (1/0)? :\n ");

fflush(stdin);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -1;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

if(!push(c)) return -5;


root=c;

while(top){

p=pop();

printf("Doriti sa creati fiul drept al nodului %s (1/0)? :\n ",p->proprietarul);

fflush(stdin);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -3;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

p->right = c;

if(!push(c)) return -5;

} else {

p->right = NULL;

printf("Doriti sa creati fiul sting al nodului %s (1/0)? : \n",p->proprietarul);

fflush(stdin);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -3;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\


printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

p->left=c;

if(!push(c)) return -5;

} else {

p->left=NULL;

return 1;

//afisarea in stiva

int show_s(){

nod *p,*c;

top=NULL;

if(!root) return 0;

p=root;

if(!push(p)) return -5;

printf("Lista Disciplinelor\n\n");

while(top){

p=pop();

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);
printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);

printf("Adresa fiului sting %p\n",c->left);

c=p->right;

if(c!=NULL){

if(!push(c)) return -5;

c=p->left;

if(c!=NULL){

if(!push(c)) return -5;

pause

return 1;

//marimea in stiva

int size_s(){

nod *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;

//cautarea in stiva

nod* search_s(char *fname){

nod *p,*c;

top=NULL;

if(!root) return NULL;

p=root;

if(!push(p)) return NULL;

while(top){

p=pop();

if(!strcmp(fname,p->proprietarul)) 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;

//eliberarea memoriei in stiva

int freemem_s(){

nod *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;

}
//crearea recursiv

int creat_r(){

nod *p, *c;

int f;

root=NULL;

top=NULL;

printf("Doriti sa creati radacina arborelui (1/0)? :\n ");

fflush(stdin);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -1;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%d",&c->adresa);\

printf("suprafata : "); scanf("%d",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

if(!push(c)) return -5;

root=c;

while(top){

p=pop();

printf("Doriti sa creati fiul drept al nodului %s (1/0)? :\n ",p->proprietarul);

fflush(stdin);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));
if(!c) return -3;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

p->right = c;

if(!push(c)) return -5;

} else {

p->right = NULL;

printf("Doriti sa creati fiul sting al nodului %s (1/0)? : \n",p->proprietarul);

fflush(stdin);

scanf("%d",&f);

if(f){

c=(nod*)malloc(sizeof(nod));

if(!c) return -3;

printf("\nIntroduceti datele :\n");\

printf("Proprietarul : "); scanf("%s",&c->proprietarul);\

printf("Tipul : "); scanf("%s",&c->Tipul);\

printf("adresa : "); scanf("%s",&c->adresa);\

printf("suprafata : "); scanf("%s",&c->suprafata);\

printf("costul : "); scanf("%d",&c->costul );\

p->left=c;

if(!push(c)) return -5;

} else {

p->left=NULL;
}

return 1;

//afisarea recursiv

void show_r(nod *c){

if(!c){

return;

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);

printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);

printf("Adresa fiului sting %p\n",c->left);

show_r(c->left);

show_r(c->right);

//eliberarea memoriei recursiv

void freemem_r(nod *c){

if(!c) return;

freemem_r(c->left);

freemem_r(c->right);
free(c);

//cautarea recursiv

nod* search_r(nod* c, char *fname){

nod* t=NULL;

if(!c) return NULL;

if (!strcmp(c->proprietarul,fname)) return c;

t=search_r(c->left,fname);

if (t) return t;

t=search_r(c->right,fname);

if (t) return t;

return NULL;

//marimea recursiv

int size_r(nod *c){

static int n=0;

if(!c) return n;

n++;

size_r(c->left);

size_r(c->right);

return n;

//inaltimea arborelui

int height_r(nod *c){

int l,r;
if(!c) return -1;

l=height_r(c->left);

r=height_r(c->right);

if(l>r)return(l+1);

else{return(r+1);

void show_SRD(nod *c){ if(!c){ return; }

show_SRD(c->left);

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);

printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);

printf("Adresa fiului sting %p\n",c->left);

show_SRD(c->right);

void show_SDR(nod *c){ if(!c){ return; }

show_SDR(c->left);

show_SDR(c->right);

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);
printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);

printf("Adresa fiului sting %p\n",c->left);

void show_RDS(nod *c){

if(!c)

return;

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);

printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);

printf("Adresa fiului sting %p\n",c->left);

show_RDS(c->right);

show_RDS(c->left);

void show_DRS(nod *c){

if(!c)

{
return;

show_DRS(c->right);

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);

printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);

printf("Adresa fiului sting %p\n",c->left);

show_DRS(c->left);

void show_DSR(nod *c){

if(!c){

return; }

show_DSR(c->right);

show_DSR(c->left);

printf("==================================================\n\n");

printf("Proprietarul %s\n",c->proprietarul);

printf("Tipul %s\n",c->Tipul);

printf("adresa %s\n",c->adresa);

printf("suprafata %s\n",c->suprafata);

printf("costul %d\n",c->costul );

printf("Adresa elementului curent %p\n",c);

printf("Adresa fiului drept %p\n",c->right);


printf("Adresa fiului sting %p\n",c->left);

IMOBIL.H
//Arbore

typedef struct nod{

char proprietarul[100];

char Tipul[100];

char adresa[100];

char suprafata[100];

int costul ;

struct nod *left;

struct nod *right;

}nod;

nod *root;

//Coada

typedef struct elq{

nod *adrnod;

struct elq *next;

}elq;

elq *first;

elq *last;

//Stiva
typedef struct els{

nod *adrnod;

struct els *prev;

}els;

els *top;

//Prototipuri

int inq(nod *v);

nod* delq();

int push(nod *v);

nod* pop();

int creat_q();

int creat_s();

int creat_r();

int show_q();

int show_s();

void show_r(nod *c);

nod* search_q(char *fname);

nod* search_s(char *fname);

nod* search_r(nod* c, char *fname);

int size_q();

int size_s();

int size_r(nod *c);

void freemem_r(nod *c);

int freemem_q();

int freemem_s();
int height_r(nod *c);

void show_DSR(nod *c);

void show_DRS(nod *c);

void show_RDS(nod *c);

void show_SDR(nod *c);

void show_SRD(nod *c);

Raspuns:
Concluzie: In aceasta lucrare de laborator am implimentat tipul
abstract de date ale “Arborelui Binar” si am utilizat algoritmele iterativi si
ale algoritmelor recursivi. Am obtinut deprinderile practice de
implementare si utilizare a tipului abstract de date.

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