2015-09-12 8 views
1

строка, вызывающая ошибку, прокомментирована рядом, я пытаюсь удалить узел из связанного списка, а при установке предыдущей -> рядом с удаленным узлом - следующая ошибка сегментации.Как исправить эту ошибку сегментации?

void LinkedList::removeNode(int k) 
{ 
    Node* pre = NULL; 
    Node* curr = NULL; 
    Node* temp = NULL; 

    pre = head; 

    curr = head->get_next(); 

    for(int i =1; i<=length; i++) 
    { 

     if (i == k) 
     { 
      temp = curr->get_next(); 
      pre->set_next(temp); // this line causes segmentation error 
      if(curr == tail) 
      { 
       tail = pre; 
      } 
      delete curr; 
      break; 
     } 
     pre = curr; 
     if(curr->get_next() != NULL) 
     { 
      temp = curr->get_next(); 
      curr = temp; 
     } 
    } 
+0

Приятно предоставить [mcve] – NathanOliver

ответ

0

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

Здесь немного оптимизирован код:

void LinkedList::removeNode(int k) 
{ 

    if (head == NULL) 
     return; 

    Node* curr = head; 
    Node* next = NULL; 

    int i = 0; 
    while ((next = curr->get_next()) != NULL) { 
     if (++i == k) { 
      curr->set_next(next->get_next()); 

      if (next == tail) 
       tail = curr; 

      next->set_next(NULL); 
      delete next; 
      length--; 
      break; 
     } 

     curr = next; 
    } 
} 
+0

спасибо за оптимизацию, но с новым кодом я все еще получаю ошибку сегментации, я знаю, что значение «k» верное, и я знаю, что список работает, поскольку у меня есть метод печати, который печатает их порядок от головы до хвоста. Поэтому я все еще немного смущен, почему он не удалит узел – Nick

+0

, который вы использовали в качестве предлагаемого кода? на какой линии он перехвачен? – ankhzet

+0

eh, есть ошибка! Я обновил код. в принципе, он переходил бы в бесконечный цикл без каких-либо условий ... я споткнулся, как бы вы могли получить его для seg-fault ... он был скомпонован в начале, в 'while ((next = curr-> get_next())! = NULL)? но это возможно, только если 'head' имеет значение null ... – ankhzet

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