Я пытаюсь добавить некоторые элементы в начало очереди, в которой уже есть другие элементы. Мой код работает нормально, но он каждый раз добавляет элемент впереди. Как я могу изменить его, чтобы добавить следующий элемент после того, как добавлен передний. Вот что у меня получилось:
void Queue::addtoFront(string first, string last){
Node *temp = new Node(first, last, NULL);
temp->next = head;
head = temp;
}
Похоже, вам нужна функция addQueueToFront
. Создайте вторую очередь с желаемым порядком, затем добавьте всю очередь сразу.
После добавления элемента на передний план следующий элемент, который я добавляю с помощью этой функции, должен идти после другого переднего элемента.
Это нарушит договор, подразумеваемый таким именем, как addtoFront
. Я рекомендую другое имя, если вы действительно хотите такого поведения.
Это некоторые конкретные элементы, которые я хочу добавить на передний план, но они должны быть первыми, первым вышел, как я могу это изменить? Эти предметы будут идти на передний план, но после того, как первый фронт добавит один, второй должен быть после
может вы хотите использовать стек?
Нет, я просто пытаюсь понять, как добавить элемент после первого.
Если вы хотите добавить элементы на другом конце, вам также может понадобиться указатель tail
.
Примечание: Я не уверен, чего вы пытаетесь достичь, но вы могли бы написать функцию-член 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), который выполняет какое-то автоматическое управление и берет на себя часть вашей нагрузки.
Вы хотите, чтобы он последовательно добавлял элемент в конец очереди (рядом с указателем NULL) или во второй элемент (тот, который находится после начала)?