У меня есть массив связанных списков, каждый индекс массива содержит связанный список.Удалить указатель в двух списках
Кроме того, у меня есть другой связанный список, который удерживает узлы в точном порядке, я ввел их.
Так, например. В моем массиве 500 индексов. Я ввожу один узел из индекса 1 и один узел в индекс 2. Когда я печатаю связанный список по индексу 1, он печатает только один узел. Однако, когда я печатаю связанный список, который содержит точный порядок ввода узла, он будет печатать оба из них, чтобы я их ввел.
Я реализовал это с помощью этого кода
class CHash{
public:
CHash(){
for(int i = 0; i < 500 ;i++){
holder[i] = NULL;
}
first = NULL;
last = NULL;
};
void insert(string key , string value){
size_t num = index(key);
Node *tmp;
if(holder[num] == NULL){
tmp = new Node(key , value , NULL);
holder[num] = tmp;
}else{
tmp = new Node(key, value , holder[num]);
holder[num] = tmp;
}
if(first == NULL){
tmp -> nextNode = NULL;
tmp -> prevNode = NULL;
first = tmp;
last = tmp;
}else{
tmp -> prevNode = last;
last -> nextNode = tmp;
last = tmp;
}
}
void Print(size_t number){
Node *tmp = holder[number];
while(tmp!= NULL){
cout << tmp -> value << endl;
tmp = tmp -> next;
}
}
void PrintAll(){
Node *tmp = first;
while(tmp != NULL){
cout << tmp -> value << endl;
tmp = tmp -> nextNode;
}
}
size_t index(string name){
return name.length();
}
void de(string val){
size_t num = index(val);
if(holder[num] == NULL){
return;
}
Node *tmp = holder[num];
Node *help;
Node *help1;
while(tmp != NULL){
if(tmp -> key == val){
Node *temp = tmp;
if(tmp -> prevNode != NULL)
help = tmp -> prevNode;
else
help = NULL;
if(tmp -> nextNode != NULL)
help1 = tmp -> nextNode;
else
help1 = NULL;
if(tmp -> next != NULL){
tmp = tmp -> next;
tmp -> nextNode = help1;
tmp -> prevNode = help;
}
else
tmp = NULL;
delete temp;
return ;
}
tmp = tmp -> next;
}
}
Он работает, что меня беспокоит это de
метод. Он должен найти узел с ключом так же, как аргумент, и удалить его. Это удаление должно быть отражено в обоих связанных списках. Я пытался понять это на некоторое время, но он всегда бросает seg-ошибку.
Пример использования.
CHash one;
one.insert("two","cauko");
one.insert("tuk","hello");
one.insert("three","hrello");
one.Print(3) // should print "hello" , "cauko"
one.PrintAll() // should print "cauko" , "hello" , "hrello"
one.de("tuk");
one.Print(3); // should print only "cauko"
one.PrintAll(); // should print "cauko" , "hrello"
Где я совершил ошибку?
Представьте, что у вас была большая база кода и вы хотели найти все экземпляры 'de'. Я говорю, что вы должны дать своим функциям немного больше описательного имени. – PaulMcKenzie
Почему бы не использовать 'std :: list' вместо всего этого кода связанного списка? Или, по крайней мере, создайте рабочий отдельный класс связанных списков без хэш-таблицы. Как только он будет работать, * then * вы используете этот рабочий, отлаженный, связанный класс списка в своей большой программе хеш-таблицы. BTW, я не вижу массив связанных списков - я бы ожидал «LinkedList allLists [5];» или что-то в этом роде - это массив связанных списков. – PaulMcKenzie
'if (holder [num] == NULL) {tmp = новый узел (ключ, значение, NULL); держатель [num] = tmp; } else {tmp = новый узел (ключ, значение, держатель [num]); держатель [num] = tmp; } '. Избыточный код? – kfsone