Для начала структура Node
должна быть частным членом класса Inventory
. Соответственно, класс Inventory
не должен содержать публичные c функции-члены, которые имеют тип возврата Node *
. Так, например, эту функцию-член
Node *newNode(int data);
следует удалить. В свою очередь эту публикуемую c функцию-член
Node* insertEnd(Node* head, int data);
следует объявить как
void insertEnd( int data );
Если это требуется (но не обязательно), функция может вызывать закрытое состояние c функция-член объявлена как
static Node* insertEnd(Node* head, int data);
Поскольку вы объявили двусторонний односвязный список, то не имеет смысла определять функцию insertEnd
как рекурсивную функцию, потому что нет рекурсии. Новый узел добавляется к узлу, который вы назвали как trailer
, хотя было бы лучше назвать его как tail
.
Более того, в определениях функций newNode
и insertEnd
вы забыли указывать имя класса Inventory вроде
Node * Inventory::newNode(int data)
{
//...
}
Node * Inventory::insertEnd(Node* head, int data)
{
//...
}
И эта часть в основном
Inventory inventory1;
Node* head = NULL;
head = inventory1.insertEnd(head, 8);
head = inventory1.insertEnd(head, 11);
head = inventory1.insertEnd(head, 20);
не имеет смысла. Объект inventory1
уже содержит элемент данных head
(и trailer
), который должен быть обновлен для объекта.
Класс можно определить, например, следующим образом, как показано в демонстративном Программа ниже.
#include <iostream>
class Inventory
{
public:
Inventory() = default;
Inventory( const Inventory & ) = delete;
Inventory & operator =( const Inventory & ) = delete;
~Inventory();
void insertEnd( int data );
void clear();
friend std::ostream & operator <<( std::ostream &, const Inventory & );
private:
struct Node
{
int data;
Node *next;
} *head = nullptr, *tail = nullptr;
};
Inventory::~Inventory()
{
clear();
}
void Inventory::insertEnd( int data )
{
Node *node = new Node { data, nullptr };
if ( tail == nullptr )
{
head = tail = node;
}
else
{
tail = tail->next = node;
}
}
void Inventory::clear()
{
while ( head != nullptr )
{
Node *node = head;
head = head->next;
delete node;
}
tail = head;
}
std::ostream & operator <<( std::ostream &os, const Inventory &inventory )
{
for ( Inventory::Node *node = inventory.head; node != nullptr; node = node->next )
{
os << node->data << " -> ";
}
return os << "null";
}
int main()
{
Inventory inventory;
for ( const auto &data : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } )
{
inventory.insertEnd( data );
}
std::cout << inventory << '\n';
return 0;
}
Вывод программы:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null