Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrarea de laborator nr.4&5
La Structuri de date si algoritmi
A efectuat:
st. gr. AI-182 Croitoru Tudor
Chișinău 2019
Lucrarea de laborator nr.4&5
Sarcina de lucru: De scris trei fișiere în limbajul C pentru implementarea (2 fisiere) si utilizarea
(1 fișier – program cu funcția main) a TDA “Arbore binar geniralizat ”
1. Fișierul antet cu extensia (h) care descrie structura nodului al arborelui binar (conform
variantei din lucrarea de laborator 1) și prototipurile funcțiilor care asigură operațiunile de
prelucrare a arborelui binar. Pentru lucrare de laborator 4 în acest fișier trebuie de adaugat
descrierea structurilor elementelor cozei ș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.
2. Fisier cu extensia (cpp sau c) care conține codurile (implementările) tuturor funcțiilor
declarate în fișierul antet.
1
Varianta 10: Stat
Noţiuni teoretice
În informatica, un arbore binar este un arbore în care fiecare nod are cel mult doi succesori (fii).
De obicei, succesorii se numesc „nodul stânga” și „nodul dreapta”. Arborii binari sunt folosiți
mai ales drept arbori binari de căutare sau și la structurile de date de tip heap.
o fiecare nod are 0,1 sau 2 succesori;
o fiecare nod are un singur predecesor, cu exceptia radacinii care nu are niciunul;
o succesorii fiecarui nod sunt ordonati(fiul sting, fiul drept, daca este unul singur trebuie de
mentionat care;
Prin parcurgerea unui arbore se intelege examinarea in mod sistematic a nodurilor sale astfel
incat fiecare nod sa fie atins o singura data.Aceasta actiune este numita si "vizitare" a varfurilor
arborelui,scopul ei fiind de a stationa in fiecare varf pentru a efectua o prelucrare a informatiei
asociata varfului respectiv.Arborele este o structura neliniara de organizare a datelor,iar rolul
traversarii sale este tocmai conceperea unei aranjari liniare a nodurilor in vederea trecerii de la
unul la altul,fructificand avantajul acestei organizari
Parcurgerea arborilor
Preordine Inordine
Se parcurge rădăcina Se parcurge subarborele stâng
Se parcurge subarborele stâng Se parcurge rădăcina
Se parcurge subarborele drept Se parcurge subarborele drept
Postordine
Se parcurge subarborele stâng
Se parcurge subarborele drept
Se parcurge rădăcina
Implementare:
typedef struct arbore{
int info;
struct nod *left, *right;
}arbore;
2
Analiza datelor:
Functia main
a) date intermediare:
nm – variabilă simplă de tip întreg, opțiunea aleasă de utilizator;
fnm - variabilă locala de tip pointer la nod care reprezinta adresa elementului cautat;
nume - variabila de tip pointer la char,denumirea fisierului pentru introducere
node* deq(void);
Functia pentru eliminarea unui element din coada astfel obtinindui adresa lui.
Parametri nu sunt;
Date returnabile
v – pointer de tip nod (arbore), elementul șters;
Variabile locale
b – pointer de tip coadă, adresa în care se stochează elementul ce urmează să fie șters;
node *pop(void);
Functia pentru eliminarea unui element din stiva astfel obtinindui adresa lui.
Parametri nu sunt;
Date returnabile
v– pointer de tip nod, elementul șters;
Variabile locale
b – pointer de tip stivă, adresa în care se stochează elementul ce urmează să fie șters;
int show1(void);
Functia pentru afisarea liste de elemente cu ajutorul cozii in latime
Parametri nu sunt;
Date returnabile
functia returneaza 1 daca elementele au fost gasite,0 daca lista este vida
Variabile locale
p,b – pointer de tip nod, variabile pentru prelucrarea listei;
3
int show2(void);
Functia pentru afisarea liste de elemente cu ajutorul stivei in adincime
Parametri nu sunt;
Date returnabile
functia returneaza 1 daca elementele au fost gasite,0 daca lista este vida
Variabile locale
p,b – pointer de tip nod, variabile pentru prelucrarea listei;
int size1(void);
Functia pentru afisarea la ecran la marimii arborelui cu ajutorul cozii
Parametri nu sunt;
Date returnabile
n – variabilă simplă de tip întreg, mărimea arborelui;
Variabile locale
b,p – pointeri de tip nod, variabile pentru prelucrarea listei;
int size2(void);
Functia pentru afisarea la ecran la marimii arborelui cu ajutorul stivei
Parametri nu sunt;
Date returnabile
s – variabilă simplă de tip întreg, mărimea arborelui;
Variabile locale
c,p – pointeri de tip nod, variabile pentru prelucrarea listei;
int create(void);
Functia pentru crearea arborelui cu ajutorul cozii.
Parametri nu sunt;
Date returnabile returneaza 1 daca elementul a fost creat cu succes,0 invers;
Variabile locale
f – variabilă simplă de tip întreg, răspunsul utilizatorului.
b,p – pointeri de tip carte(arbore), variabile pentru prelucrarea listei;
node*search2(char*v);
Functia pentru cautarea unui element dupa un cimp al structurii cu ajutorul cozii.
Parametri
nume - variabila de tip ponter la char,denumirea elementrului pentru cautare;
Date returnabile
p - pointer de tip nod,adresa elementului găsit;
4
Date returnabile
p - pointer de tip nod,adresa elementului găsit;
Variabile locale
p,b– pointer de tip nod, variabile pentru prelucrarea listei;
int freemem1(void);
Functia pentru eliberarea memoriei
Parametri nu sunt;
Date returnabile returneaza 1 daca elementul a fost creat cu succes,0 invers
Variabile locale
b,p – pointeri de tip carte(arbore), variabile pentru prelucrarea listei;
void showRSD(node*b)
Functia pentru cautarea unui elementru cu ajutorul recursiei.
Parametri
b-pointer de tip nod, adresa rădăcinii;
Variabile locale nu sunt;
5
Codul programului in limbajul C
Fișierul arbore.h:
#ifndef HEADER_FILE
#define HEADER_FILE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
///Structure///
typedef struct node
{
char nume[20];
float pret;
float masa;
int cantitate;
struct node*left;
struct node*right;
} node;
node *root;
int enq(node*v);
node*deq(void);
int push(node*v);
node*pop(void);
int create1(void);
int show1(void);
node*search1(char*v);
int size1(void);
int freemem1(void);
int hight1(node*b);
int create2(void);
int show2(void);
6
node*search2(char*v);
int size2(void);
int hight2(node*b);
node*create(void);
void showBTW(node*b);
int sizeBTW(node*b);
node *searchBTW(node* b, char key[]);
void freeBTW(node*b);
int hight(node*b);
#endif
Fișierul arbore.c:
#include "arbore.h"
int enq(node*v) // returning value - integer type, parameter - v,pointer to struct node
{
elq*b; // local variable, pointer to struct elq
b=(elq*)malloc(sizeof(*b)); // function call of malloc, allocate memory for element b
if(b==NULL)return 0;
if(first==NULL){first=b;}
else{last->next=b;}
last=b;
b->next=NULL;
b->adr=v;
return 1;
}
7
els*b; // pointer to struct els, adress of first element
b=top;
top=b->prev;
v=b->adr;
free(b); // function call for freeing memory
return v;
}
/*
int create1(void) // returning value - integer type
{
node*b, *p; // b,p - local var, pointer to struct node
int f,l; // f - integer type, used for storing answers l - integer type, returning value
for enq(node*v)
printf("Doriti sa creati root (radacina)?(1/0)\n");
scanf("%d",&f);
if(f==0){return -1;}
else{
p=(node*)malloc(sizeof(*p)); // create node of parent
if(p==NULL) return -2;
root=p;
puts("Informatia despre marfa root(radacina):");
8
printf(" Cantitate: ");scanf("%d", &b ->cantitate);
p->right=b;
l=enq(b); // function call, insert in the quene
if(l==0) return -4;}
}
}
}
*/
if(l==0)
return 0;}
b=p->right;
if(b!=NULL)
{
l=enq(b);
if(l==0)
return 0;}
}
}
9
b=p->right;
if(b) l=enq(b); if(!l) return NULL;}
return NULL; }
int heightbtis(){
int h,l,n,n1,n2,n3;
node *p,*s;
n1=0;
n2=0;
top=NULL;
h=-1;
p=root;
if (!p){
return 0;
}
n=1;
l=push(p);
if (!l) return -1;
while (top){
p=pop();
s=p->left;
if (s){
n1++;
l=push(s);
if (!l) return -2;
}
else{
n2++;
}
s=p->right;
10
if (s){
n1++;
l=push(s);
if (!l) return -3;
}
else{
n2++;
}
n3=2*n;
if (n3==n1+n2){
h=h+1;
n=n1;
n1=0;
n2=0;
}
}
return h;
}
printf("Creaza radacina?(1/0)\n");
scanf("%d",&f);
if(f==0){return -1;}
else{
p=(node*)malloc(sizeof(*p)); //create parent node
if(p==NULL) return -2;
root=p;
printf(" Nume: ");fflush(stdin);gets(b->nume);
printf(" Pret: ");fflush(stdin);scanf("%f", &b ->pret);
printf(" Masa: ");fflush(stdin);scanf("%f", &b ->masa);
11
printf(" Cantitate: ");scanf("%d", &b ->cantitate);
l=push(p);
if(l==0) return -3;
while(top!=NULL)
{
p=pop(); // p get adress of node which was deleted from quene
printf("Doriti sa creati copilul stang %s? (1/0)",p->nume);
scanf("%d",&f);
if (f==0){p->left=NULL;}
else{b=(node*)malloc (sizeof (*b)); //create child node
if(b==NULL) return -2;
printf(" Nume: ");fflush(stdin);gets(b->nume);
printf(" Pret: ");fflush(stdin);scanf("%f", &b ->pret);
printf(" Masa: ");fflush(stdin);scanf("%f", &b ->masa);
printf(" Cantitate: ");scanf("%d", &b ->cantitate);
p->left=b;
l=push(b);
if(l==0) return-3; }
{ node *p,*b; // local var,pointers to struct node, p - node of parent, b-of chil
int l; // returning value for function push
p=root;
l=push(p); // insert p in the stack
if(l==0)
return 0;
while(top)
{
p=pop();
printf("Numele : %s\n",p->nume);
printf("Pret : %f\n",p->pret);
printf("Masa : %f\n",p->masa);
printf(" Cantitate : %d\n",p->cantitate);
b=p->right;
if(b!=NULL)
{
12
l=push(b);
if(l==0)
return 0;}
b=p->left;
if(b!=NULL)
{
l=push(b);
if(l==0)
return 0;}
}
}
13
b=(node*)malloc(sizeof(*b)); // create the root
if(b==NULL) return NULL;
printf(" Da-ti informatia despre root(radacina)\n");
printf(" Nume: ");fflush(stdin);gets(b->nume);
printf(" Pret: ");fflush(stdin);scanf("%f", &b ->pret);
printf(" Masa: ");fflush(stdin);scanf("%f", &b ->masa);
printf(" Cantitate: ");scanf("%d", &b ->cantitate);
{
node*t=NULL; // returning value, local var - pointer to node
if(b==NULL) return NULL;
if (strcmp(b->nume,key)==0) return b;
t=searchRSD(b->left, key); // recursive function call
if (t) return t;
14
t=searchRSD(b->right, key); // recursive function call
if (t) return t;
return NULL;
}
int hight(node*b) // returning value - integer type, paramater - pointer to struct node,
adress of first element from binary tree
{
int l,r; // local var, int type, returing values for function r - right subtree ; l - left subtree
if(!b)return -1;
l=1+hight(b->left);
r=1+hight(b->right);
if (r>=l)
{return (1+l);} else {return(1+r);}
}
Fisierul main.c:
#include "arbore.c"
int main ()
{
int fnm,lung,nm,f, l;
char v[10];
node*b;
node*p;
Tree:
while(1)
{
system("cls");
puts("1. Algoritmi iterativi ");
puts("2. Algoritmi recursivi");
puts("0. Exit");
scanf("%d", &nm);
system("cls");
switch(nm)
{
case 1:
system("cls");
while (1) {
system("cls");
system (" color e");
puts(" Algorimti iterativi folosind coada \n");
puts("1. Formarea si introducerea arborelui binar");
puts("2. Partajarea arborelui binar");
puts("3. Cautarea unui nod");
15
puts("4. Numarul de noduri");
puts("5. Inaltimea arborelui");
puts("6. Eliberarea memoriei");
puts(" Algorimti iterativi folosind stiva \n");
puts("7. Formarea si introducerea arborelui binar");
puts("8. Partajarea arborelui");
puts("9. Cautarea unui node");
puts("10. Numarul de noduri");
puts("11. Inaltimea nodului");
puts("12. Eliberarea memoriei");
puts("0. Exit");
scanf("%d",&nm);
switch(nm) {
case 1:
system("cls");
system (" color a");
create();
puts("\nTo continue press enter");
getch();
break;
case 2:
system("cls");
if(root==NULL){printf("Arborele este NULL");}else
{puts("Arborele este\n");
show1();}
getch();
break;
case 3:
system("cls");
printf("Da-ti numele marfei pe care o doriti sa o cautati \n");
fflush(stdin);
gets(v);
p=search1(v);
if(p==NULL)
{
printf("Nu exista asa marfa in lista\n");
} else
printf(" Nume: ");fflush(stdin);gets(b->nume);
printf(" Pret: ");fflush(stdin);scanf("%f", &b ->pret);
printf(" Masa: ");fflush(stdin);scanf("%f", &b ->masa);
printf(" Cantitate: ");scanf("%d", &b ->cantitate);
puts("\nTo continue press enter");
getch();
break;
case 4:
system("cls");
lung=size1();
printf("The tree has %d nodes",lung);
puts("\nTo continue press enter");
getch();
16
break;
case 5:
system("cls");
printf("Inaltimea arborelui %d \n", heightbtis());
puts("Press Enter to continue");
getch();
break;
case 6:
system("cls");
freemem1();
root=NULL;
puts("Memory was eliberated!");
printf("\nTo continue press enter");
getch();
break;
case 7:
system("cls");
create();
puts("\n To continue press enter");
getch();
break;
case 8:
system("cls");
if(root==NULL){printf("Arborele este NULL");}else
{puts("Lista de noduri\n");
show2();}
printf("\nTo continue press enter");
getch();
break;
case 9:
system("cls");
printf("Da-ti denumirea margfei pe care o doriti sa o cautati\n");
fflush(stdin);
gets(v);
p=search2(v);
if(p==NULL)
{
printf("Asa node nu exista\n");
} else
{
printf("Numele : %s\n",p->nume);
printf("Pret : %f\n",p->pret);
printf("Masa : %f\n",p->masa);
printf(" Cantitate : %d\n",p->cantitate);
puts("To continue press enter");
}
getch();
break;
case 10:
system("cls");
l=size2();
printf("Arborele are %d noduri",l);
17
printf("\nTo continue press enter");
getch();
break;
case 11:
system("cls");
printf("Inaltimea arborelui este de %d \n", heightbtis());
puts("Press Enter to continue");
getch();
break;
case 12:
system("cls");
freemem1();
root=NULL;
puts("Memoria a fost eliberata cu succes!");
printf("\nTo continue press enter");
getch();
break;
case 0:
system("cls");
goto Tree;
break;
getch();
break;
}}
case 2:
system("cls");
while (1) {
system("cls");
puts (" Algoritmi recursivi \n");
puts("13. Crearea si introducerea arborelui binar");
puts("14. Afisarea RSD a arborelui");
puts("15. Numarul de noduri");
puts("16. Cautarea unui node");
puts("17. Inaltimea nodului");
puts("18. Eliberarea memoriei");
puts("0. Exit");
scanf("%d",&nm);
system("cls");
switch (nm)
{
case 13:
system("cls");
18
else{
showRSD(root);}
puts("\n To continue press enter");
getch();
break;
case 15:
system("cls");
lung=sizeRSD(root);
printf("Arborele are %d noduri",lung);
puts("\n To continue press enter");
getch(); break;
case 16:
system("cls");
puts("Introduce-ti numele nodului ce il cautati");
fflush(stdin); gets(v);
b=searchRSD(root,v);
if (b==NULL) {puts("Asa node nu exista in lista");
puts("\n To continue press enter");
getch();
break;}
else{
printf("Numele : %s\n",p->nume);
printf("Pret : %f\n",p->pret);
printf("Masa : %f\n",p->masa);
printf("Cantitate : %d\n",p->cantitate);
}
puts("\n To continue press enter");
getch();
break;
case 17:
system("cls");
l=hight(root);
printf("Arborele are inaltimea de %d",l);
puts("\n To continue press enter");
getch();
break;
case 18:
system("cls");
freeSDR(root);
root=NULL;
puts("Memoria a fost eliberata cu succes");
puts("\n To continue press enter");
getch();
break;
case 0:
break;
default:
puts("Nu exista asa optiune\n");
getch();
}
}
19
break;
}
}
}
Screen Shot-uri:
Menu
Crearea arborelui
20
Afisarea
Marimea arborelui
21
Inaltimea arborelui
Eliberaraea memoriei
Crearea arborelui
Afisarea
22
Marimea arborelui
Inaltimea arborelui
Eliberarea memoriei
23
Crearea
Afisarea RSD
Marimea arborelui
24
Inaltimea arborelui
Eliberarea memoriei
Concluzii:
În urma efectuării acestui laborator, am elaborat un program de prelucrare a unui arbore
binar și am însușit modul de modul de repartizare a codului în fișiere, ceea ce permite ca codul să
fie mai ușor de citit și redactat. Am elaborat un meniu prin care utilizatorul poate comunica cu
programul elaborat și am implementat cele mai utile funcții de prelucrare a arborelui binar.
Bibliografie:
25
1. Conspectul prelegerilor cursului Programarea Calculatoarelor. Lector dr., conf. univ.
M.Kulev. Chișinău: UTM, 2014.
2. http://www.cprogramming.com/tutorial/c/lesson15.html
3. http://www.cplusplus.com/reference/cstdio/fwrite/?kw=fwrite (03,12,2015)
4. http://problemegratis.blogspot.com/2013/03/vectori-caractere-string.html (03,12,2015)
26