2016-02-23 2 views
-1
void SinglyLinkedList::removeBike(int c) 
{ 
    Node* current = head; 

    for(int i = 0; i < c; i++){   // traverse to desired node 
     current = current -> next; 
    } 

    if(current -> next != NULL && current -> prev != NULL){ 
     current -> prev -> next = current -> next; 
     current -> next -> prev = current -> prev; 
     delete current;      //delete node 
    } 
    else if(current -> next == NULL){ 
     current -> prev -> next = current; 
     delete current; 
    } 
    else if(current -> prev == NULL){ 
     current -> next -> prev = current; 
     delete current; 
    }  
    else 
     cout << "How did you make it this far?"; 

} 

Я уверен, что я ничего не понимаю здесь, но исследования пока не помогли.Как удалить узел в двойном связанном списке правильно?

Логически это имеет смысл для меня, но я чувствую, что это слишком просто для работы, а это не так.

отредактировано: обновлен код минус входной проверки, и он ломается от меня, когда я ввожу любой int. также я должен, вероятно, переименовать класс в список с двойной связью ... только заметил, что

+1

Лучший способ, которым я когда-либо видел, чтобы выяснить связанные списки, это привлечь узлы на листе бумаги, а затем рисовать во всех изменениях в привязке, требуемых шаг за шагом. – user4581301

+1

'for (int i = 0; i

+1

&& current! = NULL работает намного лучше, для меня ... И тогда вам нужно будет выяснить, что делать, когда вы завершаете ток NULL после цикла. –

ответ

6

Нет, это определенно не так просто.

Прежде всего, если параметр c превышает размер списка, вы взорваетесь с разыменованием нулевого указателя, поскольку ваш указатель current ударяет по нулевому указателю на последнем узле и пролетает мимо него.

Тогда, если c является 0 или индекс последнего элемента списка, либо это prev или это next указателя, соответственно, будет аннулированы, и вы также будете взрывать с нулевым указателем.

current -> prev -> next = current -> next; 
current -> next -> prev = current -> prev; 

Если current является первым элементом в списке, current->prev, очевидно, будут нулевым. Если current является последним элементом в списке, то current->next, очевидно, будет null. Угадайте, что происходит, когда вы пытаетесь разыменовать нулевой указатель?

Выводы:

A) Убедитесь, что входной параметр функции является допустимым.

B) Обеспечить специальную обработку, когда удаляемый узел является первым или последним узлом в двусвязном списке.

EDIT: по многочисленным просьбам, кто хотел бы знать, как я бы это исправить:

void SinglyLinkedList::removeBike(int c) 
{ 
    Node* current = head; 

    for(int i = 0; i < c; i++){ 
     if (!current) 
      break; 
     current = current -> next; 
    } 

    if (!current) 
      return; // Or throw an exception. Or return a bool false, maybe. 

    if (current->prev) 
     current -> prev -> next = current -> next; 
    else 
     head=current->next; 

    if (current->next) 
     current -> next -> prev = current -> prev; 
    else 
     tail=current->prev; // Assuming that there's a tail, somewhere around here... 
    delete current;      //delete node 

    // Maybe "return true;" here... 
} 
+0

Не знаю, как я это испортил. даже не думал о том, что первый или последний был желательным. Вау. оцените вход! Хорошо, я отредактирую, если у меня появятся дальнейшие проблемы после того, как я сделал это. –

+1

Нет, не нужно снимать это. Это правильный вопрос. –

+0

@SamVarshavchik Полностью фиксированный образец кода функции 'SinglyLinkedList :: removeBike()' был бы, по крайней мере, отличным. –

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