Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Tema: Implementarea tipului de date abstract “Arbore binar oarecare” in limbajul C. Algoritmi
iterativi si algoritmi recursivi.
Noţiuni de bază
Operatiile de prelucrare ale arborelui binar oarecare pot fi implementate utilizind algoritmi
iterativi sau algoritmi recursivi.
Algoritmi iterativi sunt utilizate pentru parcurgerea nodurilor arborelui “în lațime” (pe niveluri)
folosind structura de tip Coada sau pentru parcurgerea nodurilor arborelui “în adincime” (în
preordine) folosind structura de tip Stiva (lucrarea de laborator nr. 10).
Algoritmi recursivi sunt utilizate pentru parcurgerea nodurilor arborelui prin 6 modalități în
preordine (în adîncime) (2 parcurgeri), în inordine (2 parcurgeri) și în postordine (2 parcurgeri).
Structura de tip Stiva. Aceasta structura de date este un caz particular de lista care
functioneaza pe principiul LIFO (last in – first out, ultimul intrat este primul servit, puteti sa va
ganditi la o stiva de materiale pentru care un nou material se va adauga intotdeauna deasupra si
se va extrage tot de deasupra). Specific acestei structuri de date este faptul ca prelucrarile se fac
intotdeauna la elementul de la acelasi capat, element pe care il vom numi vîrf.
Functia push( ) , creaza stiva cand aceasta este vida sau adauga un nou element in caz
contrar.
Functia pop( ), elimina elementul din vîrful stivei.
Structura de date de tip Coada. Aceasta structura de date este un caz particular de lista care
functioneaza pe principiul FIFO (first in – first out, primul intrat este primul servit). Specific
acestei structuri de date este faptul ca adaugarea se va face intotdeauna la ultim in timp ce
prelucrarea (stergerea) se va face la celalat capat. Pentru a prelucra o coada vor fi necesari doi
pointeri: unul il vom numi varful cozii (primul nod creat) in timp ce la capatul opus ne vom
referi la ultimul element.
Functia pune( ) , creaza coada cand aceasta este vida sau adauga un nou element la sfarsit in
caz contrar.
Functia scoate( ), elimina elementul din varful cozii.
Recursivitate. O noţiune este definită recursiv dacă în cadrul definiţiei intervine însăşi noţiunea
care se defineşte .
Reguli fundamentale pentru ca recursia să fie definită corect:
Descrierea variabilelor
Functia main:
comand- variabila locala, variabila de tip integer, comanda pentru alegere din meniu
m,m1,m2,m3-variabila locala de tip integer, indicele ciclului respectiv
t- variabila locala returnabila de tip structura, adresa elementului de cautat
fname-variabila locala de tip character, adresa denumirii statului introdus de la tastatura
Functia: inq(nod*v) si delq()
c-variabila locala de tip structura, adresa elementului inserat(sters) in coada
v- variabila locala de tip structura
Functia: pop(), push(nod*v)
c-variabila locala de tip structura, adresa elementului inserat(sters) in stiva
v- variabila locala de tip structura
Functia: creat_q(),creat_s(),creat_r() si show_q(),show_s(), show_r()
p- variabila locala de tip structura, adresa nodului parinte
c-variabila locala de tip structura, adresa nodului copil
f- variabila locala de tip integer,variabila dedicate pentru alegerea optiunii
Functia: search_s(),search_q(),search_r()
p- variabila locala de tip structura, adresa nodului parinte
c-variabila locala de tip structura, adresa nodului copil
t- variabila locala de tip pointer la structura, adresa elementului de cautat
Functia: freemem_q(),freemem_s(),freemem_r(nod *c)
p- variabila locala de tip structura, adresa nodului parinte
c-variabila locala de tip structura, adresa nodului copil
Functia: size_q(),size_s(), size_r(nod *c)
p- variabila locala de tip structura, adresa nodului parinte
c-variabila locala de tip structura, adresa nodului copil
s- variabila locala de tip integer, numarul de elemente
Functia: show_SRD(nod *c), show_SDR(nod *c), show_RDS(nod *c), show_DRS(nod *c),
show_DSR(nod *c)
c-variabila locala de tip structura, adresa nodului copil
nod *root;
elq *first;
elq *last;
els *top;
Fisierul “main.cpp”
#include "funct.cpp" switch(comand){
int main(){ case 0:
int comand,m=1,m1=0,m2=0,m3=0; system("cls");
nod *t=NULL; printf("\n\t\t\n\n\n\n\n\t\t\t\tLa Revedere!!!");
char fname[10]; printf("\n\n\t\t\t\t (^_^)");
while(1){ getch();
fflush(stdin); exit(0);
while(m){m=0; system("cls"); fflush(stdin); break;
printf("\tCrearea arborelui case 1: m1=1; break;
:\n"); case 2: m2=1; break;
printf(" 1- prin coada\n"); case 3: m3=1; break;
printf(" 2- prin stiva\n"); case 4: m=1; break;
printf(" 3- prin functie default: printf("\a\nAti introdus o comanda
recursiva\n "); gresita!\n"); break;
printf("0- Exit\n "); }
printf("\tAlegeti optiunea: ");
fflush(stdin); while(m1){ system("cls"); fflush(stdin);
scanf("%d",&comand); printf("\t\tPrelucrarea arborelui binar folosind coada:\n");
system("cls"); printf("1- Afisarea informatiei\n");
switch(comand){ printf("2- Cautarea nodului dupa denumire\n");
case 0: printf("3- Marimea arborelui\n");
system("cls"); printf("4- Inaltimea arborelui!\n");
printf("\n\t\t\n\n\n\n\n\t\t\t\tLa Revedere!!!"); printf("5- Eliberarea memoriei\n");
printf("\n\n\t\t\t\t (^_^)"); printf("6- Alegerea modul de lucru\n\n");
getch(); printf("0- Exit\n\n");
exit(0); printf("Alegeti optiunea: ");
break; scanf("%d",&comand);
case 1: creat_q(); system("cls");
break; switch(comand){
case 2: creat_s(); case 0:
break; system("cls");
case 3: creat_r(); printf("\n\t\t\n\n\n\n\n\t\t\t\tLa Revedere!!!");
break; printf("\n\n\t\t\t\t (^_^)");
default: getch();
printf("\a\nAti introdus o comanda gresita!\n"); exit(0);
m=1; break; break;
}break; case 1:
} show_q(); break;
system("cls"); fflush(stdin); case 2:
printf("\tMeniu de lucru :\n"); printf("Introduceti denumirea casei de
printf("1- Coada\n"); schimb pentru cautare:\n");
printf("2- Stiva\n"); fflush(stdin); scanf("%s",&fname);
printf("3- Recursie\n"); t=search_q(fname);
printf("4- Meniul de introducere a datelor\n"); if(t){
printf("0- Exit\n\n"); printf("\nDenumirea: %s\n",t->denum);
printf("Alegeti optiunea: "); printf("Proprietarul: %s\n",t->prop);
scanf("%d",&comand); printf("Adresa: %s\n",t->adresa);
system("cls"); printf("Oralul: %s\n",t->oral);
printf("Telefonul: %s\n",t->tel); default: printf("\a\nAti introdus o comanda
} else { gresita!\n"); break;
printf("Nu este asa casa de } pause
schimb\a"); }
} break; while(m3){ system("cls"); fflush(stdin);
case 3: printf("\t\tPrelucrarea arborelui binar recursiv:\n");
printf("Numarul de noduri a arborelui: printf(" 1 - RSD\n");
"); printf(" 2 - Cautarea nodului dupa denumire\n");
find_error(size_q()); break; printf(" 3 - Marimea arborelui\n");
case 4: printf(" 4 - Inaltimea arborelui!\n");
printf("Inaltimea arborelui: printf(" 5 - Eliberarea memoriei\n");
%d",height_r(root)); printf(" 6 - Alege modul de lucru\n");
break; printf(" 7 - SRD\n");
case 5: printf(" 8 - SDR\n");
freemem_q(); root=NULL; printf(" 9 - RDS\n");
printf("Memoria s-a eliberat cu printf("10 - DRS\n");
succes!"); printf("11 - DSR\n");
break; printf(" 0 - Exit\n\n");
case 6: m1=0; break; printf("Alegeti optiunea: ");
default: printf("\a\nAti introdus o comanda scanf("%d",&comand);
gresita!\n"); break; system("cls");
} pause switch(comand){
} case 0:
while(m2){ system("cls"); fflush(stdin); system("cls");
printf("\t\tPrelucrarea arborelui binar folosind stiva:\n"); printf("\n\t\t\n\n\n\n\n\t\t\t\tLa Revedere!!!");
printf("1- Afisarea informatiei\n"); printf("\n\n\t\t\t\t (^_^)");
printf("2- Cautarea nodului dupa denumire\n"); getch();
printf("3- Marimea arborelui\n"); exit(0);
printf("4- Inaltimea arborelui!\n"); break;
printf("5- Eliberarea memoriei\n"); case 1:
printf("6- Alege modul de lucru\n\n"); printf("RSD\n\n");
printf("0- Exit\n\n"); show_r(root); break;
printf("Alegeti optiunea: "); case 2:
scanf("%d",&comand); printf("Introduceti denumirea casei de
system("cls"); schimb pentru cautare:\n");
switch(comand){ fflush(stdin); scanf("%s",&fname);
case 0: t=search_r(root,fname);
system("cls"); if(t){
printf("\n\t\t\n\n\n\n\n\t\t\t\tLa Revedere!!!"); printf("\nDenumirea: %s\n",t->denum);
printf("\n\n\t\t\t\t (^_^)"); printf("Proprietarul: %s\n",t->prop);
getch(); printf("Adresa: %s\n",t->adresa);
exit(0); printf("Oralul: %s\n",t->oral);
break; printf("Telefonul: %s\n",t->tel);
case 1: } else {
show_s(); break; printf("Nu este asa casa de
case 2: schimb!\a");
printf("Introduceti denumirea casei de } break;
schimb pentru cautare:\n"); case 3:
fflush(stdin); scanf("%s",&fname); printf("Numarul de noduri a arborelui:
t=search_s(fname); ");
if(t){ find_error(size_r(root)); break;
printf("\nDenumirea: %s\n",t->denum); case 4:
printf("Proprietarul: %s\n",t->prop); printf("Inaltimea arborelui:
printf("Adresa: %s\n",t->adresa); %d",height_r(root));
printf("Oralul: %s\n",t->oral); break;
printf("Telefonul: %s\n",t->tel); case 5:
} else { freemem_r(root); root=NULL;
printf("Nu este asa casa de printf("Eliberarea memoriei a avut loc
schimb!\a"); cu succes!\a");
} break; break;
case 3: case 6: m3=0; break;
printf("Numarul de noduri a arborelui: case 7: printf("SRD\n\n");
"); show_SRD(root); break;
find_error(size_s()); break; case 8: printf("SDR\n\n");
case 4: show_SDR(root); break;
printf("Inaltimea arborelui: case 9: printf("RDS\n\n");
%d",height_r(root)); show_RDS(root); break;
break; case 10: printf("DRS\n\n");
case 5:freemem_s(); root=NULL; show_DRS(root); break;
printf("Memoria s-a eliberat cu succes!"); case 11: printf("DSR\n\n");
break; show_DSR(root); break;
case 6: m2=0; break;
default: printf("\a\nAti introdus o comanda }
gresita!\n"); break; return 0;
} pause }
}
Rezultatele obtinute:
Meniu
Mărimea arborelui
Înălțimea arborelui
Cautarea
SRD
DSR