Вдвойне связанный список, проблемы с хвостом - PullRequest
0 голосов
/ 22 мая 2018

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

double linked_list::pop_back()
{
    double value = tail->value;
    if (size() == 1)
    {
        delete tail;
        tail = NULL;
    }
    else
    {
        node_t * temp = tail->prev;
        temp->next = nullptr;
        delete tail;
        tail = temp;
    }
    return value;
}

Я получаю сообщение об ошибке: tail равно nullptr но это не должно быть, так как моя push_back() функция работает правильно.

void linked_list::push_back(double value) {
    node_t * n = new node_t(value);
    n->value = value;

    if (head == nullptr) {
        head = n; 
    }
    if (tail != nullptr) {
        tail->next = n;
    }
    n->next = nullptr;
    n->prev = tail;
    tail = n;
}

Я получаю ошибку:

image

Для записи я начал head и tail в0 при создании структуры.

1 Ответ

0 голосов
/ 22 мая 2018

В вашем pop_back() есть несколько логических недостатков:

  • Вы не проверяете, действителен ли tail перед чтением из tail->value.Когда size() == 0, tail будет nullptr (вы можете даже видеть на своем скриншоте, что tail равно "0x00000000 <NULL>", когда происходит ошибка).

  • Вы не являетесьпроверка правильности temp перед обновлением temp->next.Когда size() == 1, temp будет nullptr, поскольку tail указывает на единственный узел в списке.

  • Вы вообще не обновляете head.Когда size() == 1, head и tail будут указывать на один и тот же узел, поэтому delete 'этот узел оставит head недействительным, если вы не обновите его (вы также можете увидеть на скриншоте, чтоhead->next и head->prev недопустимы - 0xdddddddd - это также показывает, что вы не управляете своими узлами правильно).

Вместо этого попробуйте что-то вроде этого:

double linked_list::pop_back()
{
    // if the list is empty, return whatever you want, but it
    // would be better to throw an exception instead, since
    // there is nothing to pop ...
    if (!tail)
        return 0.0;

    node_t *n = tail;
    double value = n->value;

    if (n->prev)
        n->prev->next = nullptr;
    else
        head = nullptr;

    tail = n->prev;
    delete n;

    return value;
}
...