#include #include template struct Node { T value; Node* next = nullptr; Node* prev = nullptr; }; template class List { private: 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; while (currentNode->next!=nullptr) { currentNode = currentNode->next; delete currentNode->prev; } delete currentNode; } 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++; } void pop() { end = end->prev; end->next = nullptr; lenght--; } void pop(Node* node) { // Node* prev = node->prev; node->next->prev = node->prev; node->prev->next = node->next; lenght--; } void pop(int index) { if (index==0) { start = getNode(index+1); lenght--; return; } if (index>=lenght-1) { pop(); return; } Node* node = getNode(index); pop(node); } 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; } };