TArb ConstrAA (int lim, int nn, int vi, int vs) /*- construieste un arbore de inaltime < lim, cu cel mult nn noduri cu chei in intervalul [vi,vs] -*/ { int niv; /* nivel; inserarea se poate face pe nivel 0..lim-1 */ TArb a = NULL, *aa; /* a - arbore, aa - adresa arbore */ while (nn > 0) /* mai trebuie inserate noduri */ { for (niv = 0, aa = &a; niv < lim ; niv++) /* parcurgere in adancime */ if (!(*aa)) /* la adresa aa se poate insera */ { *aa = ConstrFr(random(vs-vi+1)+vi); /* incearca legare nod nou */ if (!*aa) return a; /* nu mai exista spatiu */ nn--; /* scade numar noduri de inserat */ break; } else aa = random(2) ? &(*aa)->dr : &(*aa)->st; /* avans dreapta sau stanga, aleator */ } return a; }
void ConstrArbPref (TArb *a,VctStr sir[50],int *p,int *k) /* Functie de construire a arborului pentru ecuatii prefixate */ { if ( (ispunct(sir[(*p)].str[0]) ) && (sir[(*p)].str[0] != '<' ) && (sir[(*p)].str[0] != '>' ) ) /* Daca s-a gasit operator */ { (*a)=(TNod*)malloc(sizeof(TNod)); /* Alocam spatiu pentru un nod si il completam */ if ( !(*a) ) return; (*a)->rez = (double*)malloc(sizeof(double)); (*a)->cost = (int*)malloc(sizeof(int)); ((*a)->info)=sir[(*p)].str; (*p)++; ConstrArbPref(&((*a))->st,sir,p,k); /* Construim subarbore stang */ ConstrArbPref(&((*a))->dr,sir,p,k); /* Construim subarbore drept */ (*(*a)->cost) = 1 + (*(*a)->st->cost) + (*(*a)->dr->cost) ; return; } if(strcmp(sir[(*p)].str, "sqrt") == 0 || strcmp(sir[(*p)].str, "pow") == 0 ){ (*a)=(TNod*)malloc(sizeof(TNod)); /* Alocam spatiu pentru un nod si il completam */ if ( !(*a) ) return; (*a)->rez = (double*)malloc(sizeof(double)); (*a)->cost = (int*)malloc(sizeof(int)); (*(*a)->cost) = 2; ((*a)->info)=sir[(*p)].str; (*p)++; ConstrArbPref(&((*a))->st,sir,p,k); /* Construim subarbore stang */ ConstrArbPref(&((*a))->dr,sir,p,k); (*(*a)->cost) = 1 + (*(*a)->st->cost) + (*(*a)->dr->cost) ; return; } if(strcmp(sir[(*p)].str, "sum") == 0 || strcmp(sir[(*p)].str, "prod") == 0){ (*a)=(TNod*)malloc(sizeof(TNod)); /* Alocam spatiu pentru un nod si il completam */ if ( !(*a) ) return; (*a)->rez = (double*)malloc(sizeof(double)); (*a)->cost = (int*)malloc(sizeof(int)); (*(*a)->cost) = 3; ((*a)->info)=sir[(*p)].str; (*p)++; ((*a)->start)=atol(sir[(*p)].str); (*p)++; ((*a)->end)=atol(sir[(*p)].str); (*p)++; ((*a)->var)=sir[(*p)].str[0]; ConstrArbPref(&((*a))->st,sir,p,k); ConstrArbPref(&((*a))->dr,sir,p,k); (*(*a)->cost) = (*(*a)->dr->cost) * (((*a)->end) - ((*a)->start) + 1); return; } if ( isalnum(sir[(*p)].str[0]) ) /* Daca s-a gasit nume de variabila */ {printf("Operator %c\n",sir[(*p)].str[0]); (*a)=ConstrFr( (sir[(*p)].str)); /* Construim frunza */ (*p)++; return; } if ( sir[(*p)].str[0] = '<' ) /* Daca s-a gasit "<" se mareste doar p-ul */ { (*p)++; ConstrArbPref(&((*a)),sir,p,k); } if(*p == *k) /* In cazul in care p devine egal cu lungimea sirului,returnam functia */ /* Motivul pentru care am folosit acest if este faptul ca functia nu functiona cum trebuie fara ea , recunosc ca la starteput a fost "lucky guess", intelegand pe urma folosinta ei si anume : Functia se oprea ( din cate mi-am dat seama ) la ultimul caracter si nu primea functia recursiva rezultat corect */ return; if ( sir[(*p)].str[0] = '>' ) /*In cazul in care dam peste ">" */ { (*p)++; return; } }