コード例 #1
0
ファイル: avl.c プロジェクト: Felipe31/Ramalingam-Reps
/**
 * Finds the first node in an avl-tree with a key greater or equal
 * than the specified key
 * @param tree pointer to avl-tree
 * @param key pointer to specified key
 * @return pointer to avl-node, NULL if no node with
 *    key greater or equal specified key exists.
 */
struct avl_node *
avl_find_greaterequal(const struct avl_tree *tree, const void *key) {
  struct avl_node *node, *next;
  int diff;

  if (tree->root == NULL)
    return NULL;

  node = _avl_find_rec(tree->root, key, tree->comp, &diff);

  /* go right as long as key>node.key */
  while (diff > 0) {
    if (list_is_last(&tree->list_head, &node->list)) {
      return NULL;
    }

    node = (struct avl_node *)node->list.next;
    diff = (*tree->comp) (key, node->key);
  }

  /* go left as long as key<=next_node.key */
  next = node;
  while (diff <= 0) {
    node = next;
    if (list_is_first(&tree->list_head, &node->list)) {
      break;
    }

    next = (struct avl_node *)node->list.prev;
    diff = (*tree->comp) (key, next->key);
  }
  return node;
}
コード例 #2
0
ファイル: fms_mem_tree.c プロジェクト: fremaks/fremaks_utils
//ÊͷŵÄʱºòºÏ²¢,Ïà¶ÔÓÚbinder¶øÑÔ£¬ÕâÀïµÄ»º³åÇø»áÀ©Õ¹£¬ËùÒÔÄÚ´æ²»ÊÇÈ«²¿Á¬Ðø£¬¶øÊÇÒ»¶Î¶ÎÁ¬Ðø
void fms_mem_free(fms_mem_pool *mem_pool, void *data) {
	fms_mem_block *block = (fms_mem_block *)((fms_u8 *)data - sizeof(fms_mem_block));//×îºÃÓúêÀ´ÊµÏÖ
	
	
	rb_erase(&block->rb_node, &mem_pool->allocated_blocks);

	if (!list_is_last(&block->entry, &mem_pool->blocks)) {//Èç¹û²»ÊÇ×îºóÒ»¸ö£¬ÏòºóºÏ²¢
		fms_mem_block *next = list_entry(&block->entry.next, fms_mem_block, entry);
		if (next->free && next->id == block->id) { //IDÏàͬ²ÅÊÇͬһ¶ÎÁ¬ÐøÄڴ棬²Å¿ÉÄܺϲ¢
			rb_erase(&next->rb_node, &mem_pool->free_blocks);
			list_del(&next->entry);
			block->data_size += sizeof(fms_mem_block) + next->data_size;//Êý¾ÝÇøÀ©Õ¹£¬ºÏ²¢
		}
	}
	
	if (!list_is_first(&block->entry, &mem_pool->blocks)) {//Èç¹û²»ÊÇ×îÇ°ÃæµÄÒ»¸ö£¬ÏòÇ°ºÏ²¢
		fms_mem_block *prev = list_entry(&block->entry.prev, fms_mem_block, entry);
		if (prev->free && prev->id == block->id) { 
			rb_erase(&prev->rb_node, &mem_pool->free_blocks);
			prev->data_size += sizeof(fms_mem_block) + block->data_size;
			list_del(&block->entry);
			block = prev;
		}
	}
	
	block->free = FMS_TRUE;
	mem_block_insert_free(mem_pool, block);
	
}