2016-02-22 2 views
1

Я не уверен, почему я получаю эту ошибку seg. Я думаю, что это, вероятно, связано с переходом списка. Я догадываюсь в конце, он все еще пытается пройти, но он видит nullptr.Удаление дубликатов в связанном списке C++ (Seg Faulting)

Я попытался поставить еще одно условие, чтобы проверить, является ли nextNode значением nullptr, а затем прекратить обход, но я не мог заставить его работать.

Что мне не хватает?

void LinkedList::removeDuplicates() 
{ 
    Node* traverse = m_front; 
    Node* nextNode = traverse->getNext(); 
    Node* duplicate = nullptr; 

    if (!isEmpty()) 
    { 
     while(traverse != nullptr) 
     { 
      if (traverse->getValue() == nextNode->getValue()) 
      { 
       std::cout << "Found duplicate\n"; 
       duplicate = nextNode; 
       nextNode = nextNode->getNext(); 

       delete duplicate; 
       duplicate = nullptr; 

       traverse->setNext(nextNode); 
      } 

      traverse = nextNode; 
      nextNode = nextNode->getNext(); 
     } 
    } 
} 
+1

Для сбоев укажите номер строки, в которой произошел сбой, а также трассировка стека. – MrEricSir

ответ

1

Ваш код предполагает, что список отсортирован, иначе он не будет работать вообще.

Если список пуст, то траверс будет пустым, и инициализация nextNode завершится сбой.

Последняя строка также выйдет из строя, потому что последний временной ход будет пустым, а nextnode будет равен нулю.

Я просто переставить NextNode и изменить условие при:

void LinkedList::removeDuplicates() 
{ 
    Node* traverse = m_front; 
    Node* duplicate = nullptr; 

    if (!isEmpty()) 
    { 
     Node* nextNode = traverse->getNext(); 
     while(nextNode != nullptr) 
     { 
      if (traverse->getValue() == nextNode->getValue()) 
      { 
       std::cout << "Found duplicate\n"; 
       duplicate = nextNode; 
       nextNode = nextNode->getNext(); 

       delete duplicate; 
       duplicate = nullptr; 

       traverse->setNext(nextNode); 
       continue; // Don't advance again, we already skipped an element. 
      } 

      traverse = nextNode; 
      nextNode = nextNode->getNext(); 
     } 
    } 
} 

Edit: Добавлено в дальнейшем избежать проблем удаления последнего элемента и проблем, пропустив три дубликатов подряд.

+0

Да, вопрос предполагает, что список отсортирован, поэтому я не беспокоился о реализации сортировки. – heyyo

+1

И исходная версия, и ваше предлагаемое решение также не сработают правильно, если в строке больше двух повторяющихся значений. Например, если в строке есть три повторяющихся значения, будет удалено только второе дублирующее значение. Список будет содержать два повторяющихся значения, исходный первый и оригинальный третий. –

+0

Да, это сбой. Я исправлял это, когда вы ввели комментарий, который я думаю :) –

Смежные вопросы