Почему ключевое слово "delete" не удаляет узел? - PullRequest
0 голосов
/ 23 октября 2018

Я реализовал двусвязный список.Проблема состоит в том, чтобы удалить узел с определенным значением.Для этого мне сначала нужно найти это значение в списке.Если он существует, я должен удалить его, установив остальные указатели соответственно.Я даже пытался удалить, используя «free» вместо «delete», но в моем случае это тоже не сработало.В коде нет ошибок, но узел не удаляется после выполнения.Вот мой код:

void remove(i)
{
    node *n= find(i);
    node *prev= n->GetPrev();
    node *next=n->GetNext();

    if(n!=NULL)
    {
        if(prev!=NULL && next!=NULL)
         {
            prev->SetNext(next);
            next->SetPrev(prev);
            delete n;
         }

        else if(prev!=NULL && next==NULL)
         {
            prev->SetNext(NULL);
            delete n;
         }
    }
}

PS Я написал код для всех возможных случаев одинаково.

Деструктор для этого класса записывается как:

~DL()
{
    node *current = head;

    while (current)
    {
        node<T> *next = current->GetNext();
        delete current;
        current = next;
    }
    delete head;
    delete tail;
}

Я вставил различные целочисленные значения в список.Вставка работает правильно.Но когда я пытаюсь удалить узлы, вставленные в список, используя цикл, возвращается тот же узел, который был ранее в заголовке, показывая, что он не был удален раньше.Функция checkRemove реализует эти шаги.

checkRemove()
{
for (int i = 0; i < 50; i++)
    {
        addToHead(i);
    }

while(length>10)
node *temp= returnHead(); 
if (temp != NULL)
            cout<<"Value of head node is "<<temp->returnValue()<<endl;
            remove(temp->returnValue());
}

В моем случае значения в списке различны, поэтому они встречаются только один раз.Оператор print печатает оператор «Значение узла узла» только дважды вместо печати значений до тех пор, пока длина списка не станет равной 9.

1 Ответ

0 голосов
/ 23 октября 2018

Кроме того, что вы показали, не может быть вашим реальным кодом,

void remove(i)
{
  node *n = find(i);
  node *prev = n->GetPrev();  // **** crash if n == NULL
  node *next = n->GetNext();

  if (n != NULL)  // **** is too late, execution will never reach this if n == NULL
  {
      if (prev != NULL && next != NULL)
      {
          prev->SetNext(next);
          next->SetPrev(prev);
          delete n;
      }

      else if (prev != NULL && next == NULL)
      {
          prev->SetNext(NULL);
          delete n;
      }
      // n won't be deleted if both prev and next are nullptr
  }
}

Проще:

void remove(int value)
{
    node *n = find(value);
    if (!n) return;  // nothing to do

    node *prev = n->GetPrev();
    node *next = n->GetNext();

    if (prev) prev->SetNext(next);
    if (next) next->SetPrev(prev);

    delete n;
}
...