#include #include "CSListT.h" #include using namespace std; struct NodeT { ItemT data; NodeT * next{nullptr}; }; NodeT * CopyList(NodeT * head) { NodeT * newList{nullptr}; NodeT * walker{head}, * newWalker{nullptr}; if (nullptr != head) { while (nullptr != walker) { NodeT * tmp = new NodeT; tmp->data = walker->data; tmp->next = nullptr; if (nullptr == newList) { newList = tmp; } else { newWalker->next = tmp; } newWalker = tmp; walker = walker->next; } } return newList; } ListT::ListT(const ListT & other) { head = CopyList(other.head); tail = head; for(tail = head; tail!= nullptr and tail->next != nullptr; tail =tail->next); size = other.size; } ListT::~ListT(){ NodeT * tmp{head}; while (nullptr != head) { head = head->next; delete tmp; tmp = head; } } void ListT::PushFront(ItemT i){ NodeT * tmp{nullptr}; tmp = new NodeT; tmp->data = i; tmp->next = nullptr; if (nullptr == head) { head = tmp; tail = tmp; } else { tmp->next = head; head = tmp; } ++size; } void ListT::PopFront(){ NodeT * tmp{head}; if (nullptr != head) { head = head->next; delete tmp; if (nullptr == head) { tail = nullptr; } --size; } } size_t ListT::Size() const{ return size; } void ListT::Home(){ ptr = head; } bool ListT::Next(){ if (nullptr != ptr) { ptr = ptr-> next; return true; } return false; } bool ListT::AtEnd(){ return nullptr == ptr; } ItemT & ListT::Data(){ if (nullptr != ptr) { return ptr->data; } throw out_of_range{"Attempt to access an empty pointer."}; }