Сам код работает , хотя и не компилируется в своем текущем состоянии (добавлено редактирование для его компиляции). Когда он компилируется, я получаю правильный вывод при добавлении в него элементов.
Однако код далек от good :
- Во-первых, это не код C ++ , а C с некоторыми нотациями C ++ - здесь не используются классы, которые создают эти
ListPrint
и ListAppend
, которые на 100% C функции. - Не соответствует API очереди (FIFO, то есть не удаляется после !).
- Он подвержен утечкам памяти при использовании необработанных указателей (что является плохой практикой после C ++ 11).
Посмотрите на следующий код:
#include <stdint.h>
#include <memory>
#include <iostream>
template <typename T>
class Queue
{
public:
T pop()
{
if (size > 0)
{
T ret_val = head->data;
if (size == 1)
{
head = nullptr;
tail = nullptr;
}
else
{
head = head->next;
}
--size;
return ret_val; // here the previous head has no more references, thus deleted.
}
else
{
// some error handling.
}
}
void push(T value)
{
std::shared_ptr<Node<T>> node = std::shared_ptr<Node<T>>(new Node<T>(value));
if (size == 0)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = node;
}
++size;
}
void print() const
{
if (size == 0)
{
std::cout << "Empty Queue" << std::endl;
}
else
{
std::shared_ptr<Node<T>> node = head;
std::cout << "Queue of size " << size << ": ";
while (node != nullptr)
{
std::cout << node->data << ",";
node = node->next;
}
std::cout << std::endl;
}
}
bool isEmpty() const { return size == 0; }
private:
template <typename S>
struct Node
{
S data;
std::shared_ptr<Node<S>> next;
Node(S data) :
data(data),
next(nullptr)
{
}
};
std::shared_ptr<Node<T>> head = nullptr;
std::shared_ptr<Node<T>> tail = nullptr;
uint64_t size = 0;
};
int main()
{
Queue<int> q;
q.print();
for (int i = 0; i < 10; ++i)
{
q.push(i);
q.print();
}
for (uint64_t i = 0; i < 10; ++i)
{
std::cout << "Popped: " << q.pop() << std::endl;
q.print();
}
}
Его вывод :
Empty Queue
Queue of size 1: 0,
Queue of size 2: 0,1,
Queue of size 3: 0,1,2,
Queue of size 4: 0,1,2,3,
Queue of size 5: 0,1,2,3,4,
Queue of size 6: 0,1,2,3,4,5,
Queue of size 7: 0,1,2,3,4,5,6,
Queue of size 8: 0,1,2,3,4,5,6,7,
Queue of size 9: 0,1,2,3,4,5,6,7,8,
Queue of size 10: 0,1,2,3,4,5,6,7,8,9,
Queue of size 9: 1,2,3,4,5,6,7,8,9,
Queue of size 8: 2,3,4,5,6,7,8,9,
Queue of size 7: 3,4,5,6,7,8,9,
Queue of size 6: 4,5,6,7,8,9,
Queue of size 5: 5,6,7,8,9,
Queue of size 4: 6,7,8,9,
Queue of size 3: 7,8,9,
Queue of size 2: 8,9,
Queue of size 1: 9,
Empty Queue
Как и ожидалось.
В этом коде используются классы (чего-то, чего полностью не было в вашем коде!), Упрощенный алгоритм pop, интеллектуальные указатели для управления памятью, и он может содержать данные любого типа, не только целые числа!