コード例 #1
0
ファイル: trie.c プロジェクト: AllenWangxiao/knet
int _trie_node_remove(ktrie_node_t* node, const char* s, void** value) {
    int           error      = error_ok;
    ktrie_node_t* start_node = 0;
    verify(node);
    verify(s);
    error = _trie_node_find(node, s, s, value);
    if (error_ok != error) {
        return error;
    }
    /* 减少路径引用计数 */
    if (_trie_node_decref_path(node, &start_node, s)) {
        /* 销毁路径 */
        _trie_node_delete_path(start_node, s);
        if (start_node->parent) { /* 非根节点 */
            if (start_node->parent->left == start_node) {
                start_node->parent->left = 0;
                _trie_node_destroy_self(start_node, 0);
            } else if (start_node->parent->right == start_node) {
                start_node->parent->right = 0;
                _trie_node_destroy_self(start_node, 0);
            } else if (start_node->parent->center == start_node) {
                start_node->parent->center = 0;
                _trie_node_destroy_self(start_node, 0);
            }
        } else {
            /* 根节点 */
            _trie_node_reset(start_node);
        }
    }
    return error;
}
コード例 #2
0
ファイル: trie.c プロジェクト: libin581/knet
int _trie_node_remove(ktrie_node_t* node, const char* s, void** value) {
    int           error       = error_ok;
    ktrie_node_t* start_node  = 0;
    ktrie_node_t* parent_node = 0;
    verify(node);
    verify(s);
    error = _trie_node_find(node, s, s, value);
    if (error_ok != error) {
        return error;
    }
    /* 减少路径引用计数 */
    if (_trie_node_decref_path(node, &start_node, s)) {
        /* 销毁路径 */
        _trie_node_delete_path(start_node, s);
        if (_trie_node_check_orphan(start_node)) {
            _trie_node_destroy_self(start_node, 0);
        }
        start_node = 0;
    }
    if (start_node) {
        /* 使当前节点无效 */
        destroy(start_node->real_key);
        start_node->real_key = 0;
        while (start_node && _trie_node_check_orphan(start_node)) {
            parent_node = start_node->parent;
            _trie_node_destroy_self(start_node, 0);
            start_node = parent_node;
        }
    }
    return error;
}
コード例 #3
0
ファイル: trie.c プロジェクト: AllenWangxiao/knet
int trie_find(ktrie_t* trie, const char* s, void** value) {
    verify(trie);
    verify(s);
    verify(*s);
    if (value) {
        *value = 0;
    }
    return _trie_node_find(trie->root, s, s, value);
}
コード例 #4
0
ファイル: trie.c プロジェクト: AllenWangxiao/knet
int _trie_node_find(ktrie_node_t* node, const char* key, const char* s, void** value) {
    char c = 0;
    char n = 0;
    verify(node);
    verify(s);
    verify(key);
    if (!node->key) {
        return error_trie_not_found;
    }
    c = *s;
    if (node->key == c) { /* 中间节点 */
        s += 1;
        n = *s;
        if (!n) {
            if (!node->real_key) {
                return error_trie_not_found;
            }
            if (strcmp(node->real_key, key)) {
                return error_trie_not_found;
            }
            if (value) {
                *value = node->value;
            }
            return error_ok;
        }
        if (node->center) {
            return _trie_node_find(node->center, key, s, value);
        }
    } else if (node->key > c) { /* 左边节点 */
        if (node->left) {
            return _trie_node_find(node->left, key, s, value);
        }
    } else if (node->key < c) { /* 右边节点 */
        if (node->right) {
            return _trie_node_find(node->right, key, s, value);
        }
    }
    return error_trie_not_found;
}