Имея две хеш-таблицы, при удалении элемента в один он удаляется в другом - PullRequest
0 голосов
/ 07 июня 2018

Я реализовал хеш-таблицу, и я инициализировал два разных типа, как это:

hashtable *active_users = create();
hashtable *inactive_users = create();

Элемент из хеш-таблицы выше выглядит так:

typedef struct user{
    char nick[6];
    char name[26];
    int n_messages;
    bool occupied;
}user;

В моей основной программе у меня естьфункция, которая удаляет пользователя из active_users и вставляет его в inactive_users, проблема в том, что при удалении элемента из active_users после вставки его в inactive_users он по какой-то причине удаляет его в обоих.

hashtable * delete_user(hashtable *active_users, hashtable *inactive_users, char *input_a){
    if(contains(active_users, input_a) != -1){
        user *tmp = get_item(active_users, input_a); //gets the user from the active_users hashtable
        if(load_factor(inactive_users)) //checks the hashtable size
            inactive_users = resize_HashTable(inactive_users); // if needed it resizes
        insert2(inactive_users, tmp); //insert in inactive_users
        print_table(inactive_users);
        printf("\n");
        delete_item(active_users, input_a); //deletes from active_users
        print_table(inactive_users);
        printf("+ user %s removed\n", input_a);
    }else{
        printf("+ user %s doesnt exist\n", input_a);
    }
    return inactive_users;
}

В приведенном выше коде я напечатал хеш-таблицу inactive_users после добавления туда нового пользователя и после удаления того же пользователя из active_users, чтобы вы могли увидеть проблему.

inactive_usersпосле вставки:

i: 0, nick: me, name: mig
i: 1, nick: -, name: -
i: 2, nick: -, name: -
i: 3, nick: -, name: -
i: 4, nick: -, name: -

inactive_users после удаления из active_users

i: 0, nick: -, name: -
i: 1, nick: -, name: -
i: 2, nick: -, name: -
i: 3, nick: -, name: -
i: 4, nick: -, name: -

Чтобы удалить элемент из хеш-таблицы, я просто помечаю его переменную «занимаемая» как ложное значение местатеперь свободно использовать для вставки.код:

void delete_item(hashtable *HashTable, char *nick){
    int position = contains(HashTable, nick);
    if(position != -1){
        HashTable[position].buckets->occupied = false;
        HashTable->elements--;
    }
}

1 Ответ

0 голосов
/ 07 июня 2018

occupied - это поле структуры user, которое вы устанавливаете в false на delete_item ..

Вместо этого вы должны установить для сегментов ноль

void delete_item(hashtable *HashTable, char *nick){
    int position = contains(HashTable, nick);
    if(position != -1){
        HashTable[position].buckets = null;
        HashTable->elements--;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...