2016-10-23 2 views
-4

Я пытаюсь удалить узел по его положению, а элемент удаления строки в приведенном ниже коде вызывает ошибку seg, я пытался понять это какое-то время, но я не советовал. Вот метод удалить:C++ - Удаление узла в двусвязном списке вызывает ошибку сегментации

void* List::remove(long index){ 
    if(index > this->size-1){ 
    return NULL; 
    } 
    else { 
    long i = 0; 
    List::ListItem *item = this->head; 

    while(i <= this->size-1){ 
     if(index == 0){ 
      item->getNext()->setPrev(NULL); 
      this->head = item; 
      this->size--; 
      delete item; 
      break; 
     } 

     else if(indexOf(item->getData()) == index){ 
      item->getPrev()->setNext(this->head->getNext()); 
      item->getNext()->setPrev(this->head->getPrev()); 
      this->size --; 
      break; 
     } 
     else { 
      item = item->getNext(); 
      i++; 
     } 
    } 
} 
return NULL; 
} 
+1

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Также этот алгоритм не стоит добавлять в реализацию связанного списка. Не для чего нужны списки. – DeiDei

+0

@DeiDei Что не так с моим алгоритмом? Не могли бы вы уточнить, пожалуйста? –

ответ

0

Ваш алгоритм имеет некоторые проблемы. Вот некоторые исправления с незначительными комментариями, чтобы указать на исправления.

void/* * */ List::remove(long index){ 
    if(index > this->size-1){ 
    return /* NULL */; 
    } 
    else { 
    long i = 0; 
    List::ListItem *item = this->head; 

    while(i <= this->size-1 && i <= index /* new */){ 
     if(index == 0){ 
      item->getNext()->setPrev(this->head->getPrev() /* NULL */); 
      this->head->getPrev()->setNext(item->getNext()); // new 
      this->head = item->getNext(); 
      this->size--; 
      delete item; 
      break; 
     } 
     else if(indexOf(item->getData()) == index){ 
      item->getPrev()->setNext(item /* this->head*/ ->getNext()); 
      item->getNext()->setPrev(item /* this->head */ ->getPrev()); 
      this->size --; 
      break; 
     } 
     else { 
      item = item->getNext(); 
      i++; 
     } 
    } 
} 
return /* NULL */; 
} 

Сегфакт возникает, если index == 0. Ваш список всегда начинается с item, даже item удален. Вы должны изменить this->head в нужную ячейку - следующий за пунктом - в таком случае.

Вы должны потратить некоторое время, чтобы нарисовать связанный список на бумаге и проверить инварианты. Если вы рисуете разные случаи, у вас будет объяснение для второго случая.

+0

Наш учитель дал нам диаграмму классов, и я просто реализую ее, я нашел ее странным два –