Ejemplo n.º 1
0
Eval_p EvalTreeExtractEntry(Eval_p *root, Eval_p key, int pos)
{
   Eval_p x, cell;
   
   if (!(*root))
   {
      return NULL;
   }
   *root = splay_tree(*root, key, pos);
   if(EvalCompare(key, (*root), pos)==0)
   {
      if (!(*root)->evals[pos].lson)
      {
         x = (*root)->evals[pos].rson;
      } 
      else
      {
         x = splay_tree((*root)->evals[pos].lson, key, pos);
         x->evals[pos].rson = (*root)->evals[pos].rson;
      }
      cell = *root;
      cell->evals[pos].lson = cell->evals[pos].rson = NULL;
      *root = x;
      return cell;
   }
   return NULL;
}
Ejemplo n.º 2
0
Eval_p EvalTreeInsert(Eval_p *root, Eval_p newnode, int pos)
{
   long cmpres;
   if (!*root) 
   {
      newnode->evals[pos].lson = newnode->evals[pos].rson = NULL;
      *root = newnode;
      return NULL;
   }
   *root = splay_tree(*root, newnode, pos);

   cmpres = EvalCompare(newnode, *root, pos);
   
   if (cmpres < 0) 
   {
      newnode->evals[pos].lson = (*root)->evals[pos].lson;
      newnode->evals[pos].rson = *root;
      (*root)->evals[pos].lson = NULL;
      *root = newnode;
      return NULL;
   } 
   else if(cmpres > 0) 
   {
      newnode->evals[pos].rson = (*root)->evals[pos].rson;
      newnode->evals[pos].lson = *root;
      (*root)->evals[pos].rson = NULL;
      *root = newnode;
      return NULL;
   }
   return *root;
}
Ejemplo n.º 3
0
/* return NULL if ok, else pointer on error description */
char * VerifySyntaxForEvalCompare(char * StringToVerify)
{
	UnderVerify = TRUE;
	VerifyErrorDesc = NULL;
	EvalCompare(StringToVerify);
	UnderVerify = FALSE;
	return VerifyErrorDesc;
}
Ejemplo n.º 4
0
Eval_p EvalTreeFind(Eval_p *root, Eval_p key, int pos)
{
   if(*root)
   {
      *root = splay_tree(*root, key, pos);  
      if(EvalCompare(*root, key, pos)==0)
      {
         return *root;
      }
   }
   return NULL;
}
Ejemplo n.º 5
0
static Eval_p splay_tree(Eval_p tree, Eval_p splay, int pos) 
{
   Eval_p   left, right, tmp, newnode;
   long     cmpres;
   
   if (!tree) 
   {
      return tree;
   }
   
   newnode = evals_alloc_raw(splay->eval_no);
   newnode->evals[pos].lson = NULL;
   newnode->evals[pos].rson = NULL;
   left = newnode;
   right = newnode;
   
   for (;;) 
   {
      cmpres = EvalCompare(splay, tree, pos);
      if (cmpres < 0) 
      {
         if(!tree->evals[pos].lson)
         {
            break;
         }
         if(EvalCompare(splay, tree->evals[pos].lson, pos) < 0)
         {
            tmp = tree->evals[pos].lson;
            tree->evals[pos].lson = tmp->evals[pos].rson;
            tmp->evals[pos].rson = tree;
            tree = tmp;
            if (!tree->evals[pos].lson)
            {
               break;
            }
         }
         right->evals[pos].lson = tree;
         right = tree;
         tree = tree->evals[pos].lson;
      } 
      else if(cmpres > 0)
      {
         if (!tree->evals[pos].rson)
         {
            break;
         }
         if(EvalCompare(splay, tree->evals[pos].rson, pos) > 0) 
         {
            tmp = tree->evals[pos].rson;
            tree->evals[pos].rson = tmp->evals[pos].lson;
            tmp->evals[pos].lson = tree;
            tree = tmp;
            if (!tree->evals[pos].rson) 
            {
               break;
            }
         }
         left->evals[pos].rson = tree;
         left = tree;
         tree = tree->evals[pos].rson;
      }
      else 
      {
         break;
      }
   }
   left->evals[pos].rson = tree->evals[pos].lson;
   right->evals[pos].lson = tree->evals[pos].rson;
   tree->evals[pos].lson = newnode->evals[pos].rson;
   tree->evals[pos].rson = newnode->evals[pos].lson;
   
   EvalsFree(newnode);
   return tree;
}