コード例 #1
0
ファイル: multiset.c プロジェクト: amable1408/Containers
/**
 * Adds a key to the multi-set.
 *
 * @param me  The multi-set to add to.
 * @param key The key to add.
 *
 * @return 0       No error.
 *         -ENOMEM Out of memory.
 */
int multiset_put(multiset me, void *const key)
{
    if (!me->root) {
        struct node *insert = multiset_create_node(me, key, NULL);
        if (!insert) {
            return -ENOMEM;
        }
        me->root = insert;
        return 0;
    }
    struct node *traverse = me->root;
    while (true) {
        const int compare = me->comparator(key, traverse->key);
        if (compare < 0) {
            if (traverse->left) {
                traverse = traverse->left;
            } else {
                struct node *insert = multiset_create_node(me, key, traverse);
                if (!insert) {
                    return -ENOMEM;
                }
                traverse->left = insert;
                multiset_insert_balance(me, insert);
                return 0;
            }
        } else if (compare > 0) {
            if (traverse->right) {
                traverse = traverse->right;
            } else {
                struct node *insert = multiset_create_node(me, key, traverse);
                if (!insert) {
                    return -ENOMEM;
                }
                traverse->right = insert;
                multiset_insert_balance(me, insert);
                return 0;
            }
        } else {
            traverse->count++;
            me->size++;
            return 0;
        }
    }
}