2016-12-08 5 views
0

Функция pop_back() должна удалить последний элемент в двусвязном списке. Однако мой текущий код удаляет последние два элемента, а не только один. Я создал свою функцию pop_front(), подобную этой, которая работает отлично. У меня возникли проблемы с выяснением того, что я сделал неправильно.C++ Двусторонний список - удаление элемента из хвоста с помощью pop_back()

Вот часть моего LinkedList заголовка с STRUCT Node:

class linkedlist 
{ 
private: 
    struct Node{ 
     Node* next; 
     Node* prev; 
     element_type data; 
    }; 
    Node* head; 
    Node* tail; 
    unsigned int numElements; 

Мой pop_back() из публичной части LinkedList:

void linkedlist::pop_back() 
{ 
    if (empty()) 
     return; 
    else { 
     Node *delBack = tail; 
     Node *nodeToDelete = delBack; 
     delBack = delBack->prev; 
     delBack->next = NULL; 
     delete nodeToDelete; 
     tail = delBack; 
     numElements--; 
    } 
} 

Если проблема не сразу очевидна, то возможно, погрешность погребена где-то еще в коде. Еще ищете.

+0

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

+0

@Ryan Хотя функция неверна, тем не менее она удаляет только один узел. :) Продолжайте поиск. :) –

+0

* Я создал свою функцию pop_front(), подобную этой * *. Это не так, как вы приближаетесь к этим связанных списков. Вы пишете функцию на основе того, что вы нарисовали на бумаге, с полями, представляющими данные и строки, обозначающие ссылки. Вы написали свой 'pop_back', не проверив, что эта логика действительно работает, нарисовав на бумаге правильный подход. – PaulMcKenzie

ответ

0

Хотя функция не удаляет два узла одновременно, тем не менее функция является неправильной. Он не проверяет, равен ли tail->prevnullptr, и он не устанавливает head в nullptr, когда список становится пустым. Функция может выглядеть следующим образом.

void linkedlist::pop_back() 
{ 
    if (tail) 
    { 
     Node *nodeToDelete = tail; 
     tail = tail->prev; 

     if (tail) 
     { 
      tail->next = nullptr; 
     } 
     else 
     { 
      head = nullptr; 
     } 

     delete nodeToDelete; 
     numElements--; 
    } 
} 
+0

Проблема была в другом месте. Мой push_front() не обновлял хвост правильно, поэтому pop_back() использовал хвост, который не был правильно выстроен в списке. Благодарю. – Ryan

+0

@Ryan Нет вообще. Было очевидно, что другой код также ошибочен. –