Здравствуйте, я хочу удалить указанный элемент из ключа в хеш-таблице, но функция, которая у меня есть, удаляет последнее значение, которое я вставил в ключ. Мне нужны два аргумента в моей функции. Например, я хочу удалить элемент 3 из ключа 1.
Ключ: 1 Элементы: 2 4 3
Ключ: 2 Элементы: 5 6 7
После удаления (например, Remove (1,3)) мне нужно что-то вроде этого Key: 1 Elements: 2 4
void HashTable::Remove(int key)
{
int hash_val = HashFunc(key);
HashNode* entry = htable[hash_val];
HashNode* prev = NULL;
if (entry == NULL || entry->key != key)
{
cout<<"No Element found at key "<<key<<endl;
return;
}
while (entry->next != NULL)
{
prev = entry;
entry = entry->next;
}
if (prev != NULL)
{
prev->next = entry->next;
}
delete entry;
cout<< "Element Deleted" <<endl;
}
Любые идеи?
Я пробовал это, но это не всегда работает.
void HashTable::Remove(int key,int value)
{
int hash_val = HashFunc(key);
HashNode* entry = htable[hash_val];
while (entry != NULL)
{
if (entry->key == key)
{
if (entry->value == value)
{
delete entry;
break;
}
// cout<<entry->value<<" ";
}
entry = entry->next;
}
}
что вы видели, когда проходили по вашей программе построчно, используя отладчик?
@ user4581301 Да, я поставлю два аргумента, но понятия не имею, как настроить функцию.
[help-me]delete entry; в вашем HashTable::Remove выглядит ужасно подозрительно. Разве вам не нужно настраивать различные указатели, чтобы удалить запись из списка?
@Arkadiy Да, но иногда работает, иногда нет .. Я знаю, что это подозрительно
@Tommys, извини, я был слишком нежным. Это не «подозрительно», это неправильно. Посмотрите, что «обычное» удаление делает с указателями, и сделайте что-нибудь подобное.
Подчеркнув точку зрения Аркадия на примере. Допустим, вы связали A, B и C в A-> B-> C-> конец таблицы. Когда вы удалите B, вы получите A-> undefined. Вы хотите A-> C-> end. Лучший способ решить проблемы со связанными списками - это визуализировать проблему, нарисовав картинки.
Хорошо, я исправил это, но я не могу удалить первый узел хеш-таблицы. Если значение находится в другом сообщении, проблем нет, но когда оно на первом, оно все еще остается там.





«Мне нужны два аргумента в моей функции». Озадаченный. Вы это знаете, так почему вы указали только один? Два кажется логичным местом для начала.