Exemple #1
0
/* 
 * 新建结点(节点键值为key),并将其插入到红黑树中
 *
 * 参数说明:
 *     root 红黑树的根
 *     key 插入结点的键值
 * 返回值:
 *     0,插入成功
 *     -1,插入失败
 */
int insert_rbtree(RBRoot *root, Type key)
{
    Node *node;    // 新建结点

    // 不允许插入相同键值的节点。
    // (若想允许插入相同键值的节点,注释掉下面两句话即可!)
    if (search(root->node, key) != NULL)
        return -1;

    // 如果新建结点失败,则返回。
    if ((node=create_rbtree_node(key, NULL, NULL, NULL)) == NULL)
        return -1;

    rbtree_insert(root, node);

    return 0;
}
Exemple #2
0
acseg_index_t *
acseg_index_add(acseg_index_t *acseg_index, acseg_str_t *phrase)
{
	int i;

	acseg_rbtree_key_t rbtree_key;

	acseg_str_t atom;
	acseg_str_t * new_phrase;

	acseg_rbtree_t *childs_rbtree;
	acseg_rbtree_node_t * rbtree_sentinel, *s_node, *insert_node;

	acseg_index_item_t *index_item, *new_index_item;

	if (acseg_index->state == AC_INDEX_FIXED){
		return NULL;
	}

	childs_rbtree = acseg_index->root->childs_rbtree;
	rbtree_sentinel = childs_rbtree->sentinel;

	index_item = NULL;
	new_index_item = NULL;

	i = 0;
	while (i < phrase->len) {
		atom.data = &(phrase->data[i]);
		atom.len = get_mblen(atom.data[0]);

		rbtree_key = ord_utf8_wch((char *) atom.data);
		s_node = acseg_rbtree_search(childs_rbtree, rbtree_key);
		if (s_node == NULL){
			break;
		} else {
			i = i + atom.len;
			index_item = (acseg_index_item_t *) s_node->data;
			childs_rbtree = index_item->childs_rbtree;
		}
	}

	while (i < phrase->len){
		atom.data = &(phrase->data[i]);
		atom.len = get_mblen(atom.data[0]);
		
		rbtree_key = ord_utf8_wch((char *) atom.data);
		new_index_item = create_index_item(&atom, rbtree_sentinel, &(acseg_index->mc));

		// insert node
		insert_node = create_rbtree_node(rbtree_key, new_index_item, &(acseg_index->mc));
		acseg_rbtree_insert(childs_rbtree, insert_node);

		index_item = new_index_item;
		childs_rbtree = new_index_item->childs_rbtree;
		i = i + atom.len;
	}

	new_phrase = (acseg_str_t *) mc_calloc(&(acseg_index->mc), sizeof(acseg_str_t));

	acseg_copy_str_t(new_phrase, phrase, &(acseg_index->mc));

	acseg_list_add(index_item->output, new_phrase, &(acseg_index->mc));

	return acseg_index;
}