Добавление узла в конец связанного списка - C ++

0

Я не могу заставить эту программу присоединить узел к концу связанного списка. Я знаю, что он должен что-то сделать с помощью функции "addBack", потому что функция "addFront" работает отлично. Я думаю, этого должно быть достаточно, но если требуется больше кода, просто спросите, и вы получите.

template <typename E>
void SLinkedList<E>::addBack(const E& e)
{
    E *temp = head;
    while (temp -> next != NULL)
        temp = temp -> next;
    SNode<E> * v = new SNode<E>;
    temp -> next = v;
    v -> elem = e;
    v -> next = NULL;
}
  • 1
    Вы должны изменить E *temp = head на SNode<E> *temp = head , потому что temp - это указатель узла, с которым вы идете до конца. Компилятор должен был предупредить вас об этом. Там не было никаких сообщений?
  • 1
    Это выглядит не совсем правильно. E - это тип элемента, а не тип узла управления. Как вы ожидаете E *temp = head; даже компилировать, гораздо меньше работы (предполагается , что head является SNode<T>* И даже если фиксировано, это еще не будет работать, так как он не будет обновлять указатель головы на начальной вставки (первая вставка).
Показать ещё 4 комментария
Теги:
templates
linked-list

1 ответ

1
Лучший ответ

У вас были две проблемы с этим кодом. Сначала голова не является указателем типа E, а является указателем типа SNode. 2-й список может быть пустым при добавлении первого элемента (голова будет NULL). Поэтому вам нужно обрабатывать этот случай отдельно. Следующий код должен работать:

template <typename E>
void SLinkedList<E>::addBack(const E& e)
{
    SNode<E> * v = new SNode<E>;
    v -> elem = e;
    v -> next = NULL;

    if(head == NULL) //list is empty
        head = v;
    else
    {
        SNode<E> *temp = head;
        while (temp -> next != NULL)
            temp = temp -> next;
        temp -> next = v;
    }
}

Однако для более быстрых вставок вы должны иметь два указателя, как для головы, так и для хвоста списка. Вам не нужно будет перебирать весь список, чтобы найти хвост. Однако тогда вам придется обслуживать как голову, так и хвост при добавлении и удалении узла из списка. Это будет функция, если у вас есть оба указателя:

template <typename E>
void SLinkedList<E>::addBack(const E& e)
{
    SNode<E> * v = new SNode<E>;
    v -> elem = e;
    v -> next = NULL;

    if(head == NULL) //list is empty
        head = tail = v;
    else
        tail -> next = v;
}
  • 0
    Большое спасибо! Я сделаю необходимые исправления и прокомментирую мой успех (надеюсь).
  • 0
    Нет такой удачи ... Я получаю сообщения об ошибках для return(ptd); из "tidtable.c"
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню