#include #include template struct Node { T value; Node* next = nullptr; Node* prev = nullptr; }; template class List { protected: Node* start = nullptr; Node* end = nullptr; Node* getNode(int index) { if (index >= lenght) throw "index > lenght"; Node* currentNode = start; for(int i = 0; i < index; i++) { currentNode = currentNode->next; } return currentNode; } public: int lenght; List() { Node* start = nullptr; Node* end = nullptr; lenght = 1; } ~List() { Node* currentNode = start; if (currentNode == nullptr) return; while (currentNode->next!=nullptr) { currentNode = currentNode->next; delete currentNode->prev; } delete currentNode; } virtual void add(T value) { Node* node = new Node; node->value = value; if(start==nullptr) { start = node; end = node; return; } node->prev = end; end->next = node; end = node; lenght++; } virtual void add(T value, int index) { Node* node = new Node; node->value = value; Node* before = getNode(index-1); node->next = before->next; node->prev = before; node->next->prev = node; before->next = node; lenght++; } virtual T pop() { T result = end->value; if (end == start) { end = nullptr; start = nullptr; lenght--; return result; } end = end->prev; end->next = nullptr; lenght--; return result; } virtual T pop(Node* node) { node->next->prev = node->prev; node->prev->next = node->next; lenght--; return node->value; } virtual T pop(int index) { T result; if (index==0) { result = start->value; start = getNode(index+1); lenght--; } if (index>=lenght-1) { result = pop(); } Node* node = getNode(index); result = pop(node); return result; } T operator[](int index) { return getNode(index)->value; } friend std::ostream &operator <<(std::ostream &os, List &c) { os << "( "; Node* currentNode = c.start; while (currentNode->next!=nullptr) { os << currentNode->value << " = "; currentNode = currentNode->next; } os << currentNode->value << " )"; return os; } };