/* * 新建结点(节点键值为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; }
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; }