Добавление элементов в начало очереди без использования STL

Я пытаюсь добавить некоторые элементы в начало очереди, в которой уже есть другие элементы. Мой код работает нормально, но он каждый раз добавляет элемент впереди. Как я могу изменить его, чтобы добавить следующий элемент после того, как добавлен передний. Вот что у меня получилось:

void Queue::addtoFront(string first, string last){
 Node *temp = new Node(first, last, NULL);
    temp->next = head;
        head = temp;
}

Вы хотите, чтобы он последовательно добавлял элемент в конец очереди (рядом с указателем NULL) или во второй элемент (тот, который находится после начала)?

Kostas 01.05.2018 05:21

Похоже, вам нужна функция addQueueToFront. Создайте вторую очередь с желаемым порядком, затем добавьте всю очередь сразу.

user4581301 01.05.2018 05:26

После добавления элемента на передний план следующий элемент, который я добавляю с помощью этой функции, должен идти после другого переднего элемента.

Angad 01.05.2018 05:31

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

user4581301 01.05.2018 05:38

Это некоторые конкретные элементы, которые я хочу добавить на передний план, но они должны быть первыми, первым вышел, как я могу это изменить? Эти предметы будут идти на передний план, но после того, как первый фронт добавит один, второй должен быть после

Angad 01.05.2018 05:41

может вы хотите использовать стек?

Joseph D. 01.05.2018 05:50

Нет, я просто пытаюсь понять, как добавить элемент после первого.

Angad 01.05.2018 06:24

Если вы хотите добавить элементы на другом конце, вам также может понадобиться указатель tail.

Bo Persson 01.05.2018 09:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
111
1

Ответы 1

Примечание: Я не уверен, чего вы пытаетесь достичь, но вы могли бы написать функцию-член insertAfter. Эта функция берет новый элемент и вставляет его сразу после данного элемента в связанном списке.

Для этого вы должны сначала установить ссылку «следующий» для нового элемента, а затем вставить новый элемент сразу после запрошенного элемента.

void Queue::insert(Node *newElement, Node *insertAfter)
{
    _ASSERT(insertAfter != nullptr);
    _ASSERT(newElement != nullptr);
    // set the 'next' of the new element to the 'next' of the insertAfter
    newElement->next = insertAfter->next;
    // now insert the new element immediately after the 'insertAfter'
    insertAfter->next = newElement;
}

// Taken from the original post...
// Of course, "addToFront" is no longer the correct name for this function,
// since it does no longer add the element to the front
void Queue::addToFront(...)
{
    if (head==nullptr) {
        // see original post above
    } else {
        // insert new element at the 2nd position in the queue,
        // immediately behind the head
        insert(temp, head);
    }
}

Для дальнейшего изучения вы можете прочитать о связанные списки и взглянуть на интерфейс std :: list. И вы можете улучшить свой код с помощью shared_ptr / unique_ptr вместо использования Узел*. В современном C++ вы почти никогда не использовали бы

Node *element=new Node();

В большинстве случаев это просто плохой код. Самостоятельное управление указателями и временем жизни объекта - это приглашение к разного рода неприятным проблемам (утечки памяти, нарушения прав доступа, проблемы с мелким и глубоким копированием, невозможность освободить объекты, особенно. после исключений и т.д ...). Использование управляемых или интеллектуальных указателей значительно облегчит вашу жизнь:

shared_ptr<Node> element(new Node());
// or even better
shared_ptr<Node> element=std::make_shared<Node>();

Примечание: «управляемые / интеллектуальные указатели» не имеют ничего общего с управляемым кодом C# / C++. Название просто говорит о том, что существует класс (shared_ptr), который выполняет какое-то автоматическое управление и берет на себя часть вашей нагрузки.

Другие вопросы по теме