示例#1
0
tHTableData deleteNode(tHTableKey key) {
	tHTableNode *ukAct, *ukPrev = NULL;
	tHTableIndex index;
	tHTableData data;

	/* nejdříve spočítáme index, kde začíná lin. seznam synonym */
	index = hashFn(key);
	ukAct = hashTable[index];
	while (ukAct && !compEQ(ukAct->key, key)) {
		ukPrev = ukAct;
		ukAct = ukAct->next;
	}
	if (ukAct == NULL)
		return -1; //hledaný klíč nebyl nalezen

	if (ukPrev == NULL) /* mažeme první uzel seznamu synonym ? */
		hashTable[index] = ukAct->next; /* ano: nastav ukazatel na první prvek na další za mazaným */
	else
		/* ne: propoj prvek před mazaným s prvkem za mazaným */
		ukPrev->next = ukAct->next;

	data = ukAct->data;
	free(ukAct);
	return data;
}
示例#2
0
tHTableData findNode(tHTableKey key) {
	tHTableNode *uk;

	uk = hashTable[hashFn(key)];
	while (uk && !compEQ(uk->key, key))
		uk = uk->next;
	return uk->data;
}
示例#3
0
/**
 * 
 * Find item containing the specified primary_key. Returns the data
 * that it points to (not the item itself).
 *
 */
ListData *findList(List *l, TYPE_LIST_PRIMARY_KEY primary_key){
	ListItem *current;

	current = l->first;
	while (current != NULL){
		if (compEQ(current->data->primary_key, primary_key)) return (current->data);
		current = current->next;
	}
	return (NULL);
}
示例#4
0
RBData *findNode(RBTree *tree, TYPE_RBTREE_PRIMARY_KEY primary_key) {

  Node *current = tree->root;
  while(current != NIL)
    if(compEQ(primary_key, current->data->primary_key))
      return (current->data);
    else
      current = compLT(primary_key, current->data->primary_key) ?
	current->left : current->right;

 return NULL;
}
示例#5
0
Node *findNode(RBTree *tree, TYPEKEY key) {

  Node *current = tree->root;

  while(current != NIL)
    if(compEQ(key, current->data->key))
      return (current);
    else
      current = compLT(key, current->data->key) ?
	current->left : current->right;

 return NULL;
}
示例#6
0
文件: rbtree.c 项目: nask0/calipso
// find key
NodeType *rbtFind(RBTreeType *tree, KeyType key) 
{
	NodeType **root = &tree->root;
    NodeType *current;
    current = *root;
    while(current != SENTINEL) {
        if(compEQ(key, current->key)) {
            return current;
        } else {
            current = compLT (key, current->key) ?
                current->left : current->right;
        }
    }
    return NULL;
}
示例#7
0
Node *findNode(T data) {

   /*******************************
    *  find node containing data  *
    *******************************/

    Node *current = root;
    while(current != NIL)
        if(compEQ(data, current->data))
            return (current);
        else
            current = compLT (data, current->data) ?
                current->left : current->right;
    return(0);
}
示例#8
0
ListData *findList(List *l, TYPEKEY key)
{
  ListItem *current;

  current = l->first;

  while (current != NULL)
  {
    if (compEQ(current->data->key, key))
      return (current->data);

    current = current->next;
  }

  return (NULL);
}
示例#9
0
void insertNode(RBTree *tree, RBData *data) {
  Node *current, *parent, *x;

  /* Find where node belongs */
  current = tree->root;
  parent = 0;
  while (current != NIL) {
    if (compEQ(data->primary_key, current->data->primary_key)) {
      printf("insertNode: trying to insert but primary key is already in tree.\n");
      exit(1);
    }
    parent = current;
    current = compLT(data->primary_key, current->data->primary_key) ?
      current->left : current->right;
  }

  /* setup new node */
  if ((x = malloc (sizeof(*x))) == 0) {
    printf ("insufficient memory (insertNode)\n");
    exit(1);
  }

  /* Note that the data is not copied. Just the pointer
     is assigned. This means that the pointer to the 
     data should not be overwritten after calling this
     function. */

  x->data = data;

  /* Copy remaining data */
  x->parent = parent;
  x->left = NIL;
  x->right = NIL;
  x->color = RED;

  /* Insert node in tree */
  if(parent) {
    if(compLT(data->primary_key, parent->data->primary_key))
      parent->left = x;
    else
      parent->right = x;
  } else {
    tree->root = x;
  }

  insertFixup(tree, x);
}
示例#10
0
statusEnum insert(keyType key, recType *rec) {
    int i, newLevel;
    nodeType *update[MAXLEVEL+1];
    nodeType *x;

   /***********************************************
    *  allocate node for data and insert in list  *
    ***********************************************/

    /* find where key belongs */
    x = list.hdr;
    for (i = list.listLevel; i >= 0; i--) {
        while (x->forward[i] != NIL 
          && compLT(x->forward[i]->key, key))
            x = x->forward[i];
        update[i] = x;
    }
    x = x->forward[0];
    if (x != NIL && compEQ(x->key, key)) 
        return STATUS_DUPLICATE_KEY;

    /* determine level */
    for (
      newLevel = 0; 
      rand() < RAND_MAX/2 && newLevel < MAXLEVEL; 
      newLevel++);

    if (newLevel > list.listLevel) {
        for (i = list.listLevel + 1; i <= newLevel; i++)
            update[i] = NIL;
        list.listLevel = newLevel;
    }

    /* make new node */
    if ((x = malloc(sizeof(nodeType) + newLevel*sizeof(nodeType *))) == 0)
        return STATUS_MEM_EXHAUSTED;
    x->key = key;
    x->rec = *rec;

    /* update forward links */
    for (i = 0; i <= newLevel; i++) {
        x->forward[i] = update[i]->forward[i];
        update[i]->forward[i] = x;
    }
    return STATUS_OK;
}
示例#11
0
文件: rbtree.c 项目: nask0/calipso
// insert new node (no duplicates allowed)
RbtStatus rbtInsert(RBTreeType *tree, KeyType key, ValType val) 
{
	NodeType **root = &tree->root;

    NodeType *current, *parent, *x;

    // allocate node for data and insert in tree

    // find future parent
    current = *root;
    parent = 0;
    while (current != SENTINEL) {
        if (compEQ(key, current->key)) 
            return RBT_STATUS_DUPLICATE_KEY;
        parent = current;
        current = compLT(key, current->key) ?
            current->left : current->right;
    }

    // setup new node
    if ((x = malloc (sizeof(*x))) == 0)
        return RBT_STATUS_MEM_EXHAUSTED;
    x->parent = parent;
    x->left = SENTINEL;
    x->right = SENTINEL;
    x->color = RED;
    x->key = key;
    x->val = val;

    // insert node in tree
    if(parent) {
        if(compLT(key, parent->key))
            parent->left = x;
        else
            parent->right = x;
    } else {
        *root = x;
    }

    insertFixup(root, x, SENTINEL);

    return RBT_STATUS_OK;
}
示例#12
0
rbt_node* rbt_insert(T key, LRU_elem *associated_LRU_elem, rbt_node **root) {
    rbt_node *current, *parent, *x;

   /***********************************************
    *  allocate node for data and insert in tree  *
    ***********************************************/

    /* find where node belongs */
    current = *root;
    parent = 0;
    while (current != NIL) {
        if (compEQ(key, current->key)) return (current);
        parent = current;
        current = compLT(key, current->key) ?
            current->left : current->right;
    }

    /* setup new node */
    if ((x = malloc (sizeof(*x))) == 0) {
        printf ("insufficient memory (insertNode)\n");
        exit(1);
    }
    x->key    = key;
    x->parent = parent;
    x->left   = NIL;
    x->right  = NIL;
    x->color  = RED;
    x->associated_LRU_elem = associated_LRU_elem;

    /* insert node in tree */
    if(parent) {
        if(compLT(key, parent->key))
            parent->left = x;
        else
            parent->right = x;
    } else {
        *root = x;
    }

    insertFixup(x, root);
    return(x);
}
示例#13
0
Node *insertNode(T data) {
    Node *current, *parent, *x;

   /***********************************************
    *  allocate node for data and insert in tree  *
    ***********************************************/

    /* find where node belongs */
    current = root;
    parent = 0;
    while (current != NIL) {
        if (compEQ(data, current->data)) return (current);
        parent = current;
        current = compLT(data, current->data) ?
            current->left : current->right;
    }

    /* setup new node */
    if ((x = malloc (sizeof(*x))) == 0) {
        printf ("insufficient memory (insertNode)\n");
        exit(1);
    }
    x->data = data;
    x->parent = parent;
    x->left = NIL;
    x->right = NIL;
    x->color = RED;

    /* insert node in tree */
    if(parent) {
        if(compLT(data, parent->data))
            parent->left = x;
        else
            parent->right = x;
    } else {
        root = x;
    }

    insertFixup(x);
    return(x);
}
示例#14
0
文件: srbt.c 项目: Dmdv/olymp-docs
//-----------------------------------------------------------------------------
///  find node containing data and place to insert of not found 
/// \param[in] d               -- data to find
/// \param[in] p_root          -- refers to the tree root
/// \param[out]p_insert_parent -- where to insert the new node if not found:
///                               - *p_insert_parent := parent
///                               - if node found, this ptr is unchanged!
///                               - if no parent (empty tree) 0 is returned in this ptr
///                               this value should be passed to insertNodeToParent() function 
/// \return ptr to node found, or 0 if not found.
//-----------------------------------------------------------------------------
Node *findNode(T d, Node**p_root, Node**p_insert_parent)
{
    if(*p_root)
    {   Node *current = *p_root;
        Node *parent = 0;
        while(current != NIL)
            if(compEQ(d, current->node_data))
                return (current);
            else
            {   parent=current;
                current = compLT (d, current->node_data) ? current->left
                                                         : current->right;
            }
    
        if(p_insert_parent) *p_insert_parent = parent;
        return(0);
    }
    else
    {   if(p_insert_parent) *p_insert_parent = 0;
        return(0);
    }
}
示例#15
0
文件: rbtree.c 项目: inste/market
Node * insertNode(T data) {
    Node * current, * parent, * x;

   /***********************************************
    *  allocate node for data and insert in tree  *
    ***********************************************/

    /* find where node belongs */
    current = root;
    parent = 0;
    while (current != NIL) {
		if (compEQ(data, current->data)) {
			++current->count;
			return (current);
		}
        parent = current;
        current = compLT(data, current->data) ? current->left : current->right;
    }
    /* setup new node */
    if ((x = malloc (sizeof(*x))) == 0)
        err(EMEM);
    x->data = data;
    x->parent = parent;
    x->left = NIL;
    x->right = NIL;
    x->color = RED;
	x->count = 1;
    /* insert node in tree */
    if(parent) {
        if(compLT(data, parent->data))
            parent->left = x;
        else
            parent->right = x;
    } else
        root = x;

    insertFixup(x);
    return(x);
}