#include #include #include struct Node { int value { }; Node* next { }; }; class Circular_List { public: Circular_List() = default; // TODO: Implement destructor void push_front(int value) { Node* head { /* TODO: Allocate node */ }; if (tail == nullptr) { head->next = head; tail = head; } else { head->next = tail->next; tail->next = head; } } int pop_front() { Node* head { tail->next }; int value { head->value }; if (head == tail) { tail = nullptr; } else { tail->next = head->next; } /* TODO: Deallocate head */ return value; } // TODO: Implement front() // TODO: Implement rotate() // TODO: Implement print() private: Node* tail { nullptr }; }; int main() { Circular_List list { }; { std::ostringstream oss { }; list.print(oss); assert( oss.str() == "[ ]" ); } list.rotate(); { std::ostringstream oss { }; list.print(oss); assert( oss.str() == "[ ]" ); } list.push_front(1); list.push_front(2); list.push_front(3); { std::ostringstream oss { }; list.print(oss); assert( oss.str() == "[ 3 2 1 ]" ); } // test front assert( list.front() == 3 ); // test rotate { list.rotate(); std::ostringstream oss { }; list.print(oss); assert( oss.str() == "[ 2 1 3 ]" ); assert( list.front() == 2 ); } // test rotate together with pop_front() and push_front() { list.rotate(); list.pop_front(); list.rotate(); list.push_front(1); std::ostringstream oss { }; list.print(oss); assert( oss.str() == "[ 1 2 3 ]" ); } }