Пример #1
0
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;
}
Пример #2
0
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;
       }
  
}