#ifndef SINGLY_LINKED_LIST_HPP #define SINGLY_LINKED_LIST_HPP #include #include "Node.hpp" template struct ListNode { T _data{0}; ListNode* _next {nullptr}; }; template struct SinglyLinkedList { size_t _size {0}; ListNode* _head{ nullptr }; }; template inline bool Append(SinglyLinkedList* list, ListNode* node) { if (list->_size == 0) { list->_head = node; list->_size++; return true; } ListNode* TraverseNode = nullptr; for (TraverseNode = list->_head; TraverseNode->_next != nullptr;) { TraverseNode = TraverseNode->_next; } TraverseNode->_next = node; list->_size++; return true; } template inline bool Prepend(SinglyLinkedList* list, ListNode* node) { if (list->_size == 0) { list->_head = node; list->_size++; return true; } node->_next = list->_head; list->_head = node; list->_size++; return true; } template inline bool RemoveFirst(SinglyLinkedList* list) { if (list->_size == 0) { std::cout << "Empty list... there is nothing to delete!" << std::endl; return true; } if (list->_size == 1) { list->_head =nullptr; list->_size--; } else { ListNode* Temp = list->_head; list->_head = list->_head->_next; Temp->_next = nullptr; list->_size--; } return true; } template inline bool RemoveLast(SinglyLinkedList* list) { if (list->_size == 0) { std::cout << "Empty list... there is nothing to delete!" << std::endl; return true; } if (list->_size == 1) { list->_head = nullptr; list->_size--; return true; } ListNode* TraverseNode = list->_head; while (TraverseNode->_next->_next != nullptr) { TraverseNode = TraverseNode->_next; } TraverseNode->_next = nullptr; list->_size--; return true; } template inline bool InsertAfter(SinglyLinkedList* List, const int Data, ListNode* node) { if (List->_head == nullptr) { Append(List, node); return true; } ListNode* Traverse = List->_head; for (auto i = 1; i < Data && Traverse != nullptr; i++) { Traverse = Traverse->_next; } node->_next = Traverse->_next; Traverse->_next = node; List->_size++; return true; } template inline bool InsertBefore(SinglyLinkedList* List, const int Data, ListNode* node) { if (List->_head == nullptr) { Append(List, node); return true; } ListNode* Traverse = List->_head; ListNode* Follower = nullptr; for (auto i = 1; i < Data && Traverse != nullptr; i++) { Follower = Traverse; Traverse = Traverse->_next; } node->_next = Follower->_next; Follower->_next = node; List->_size++; return true; } template inline bool Clear(SinglyLinkedList* List) { if (List->_size == 0) { return true; } if (List->_size == 1) { List->_head = nullptr; List->_size--; return true; } ListNode* Traverse = List->_head; ListNode* TempNode = Traverse; do { TempNode = Traverse; Traverse = Traverse->_next; TempNode->_data = 0; TempNode->_next = nullptr; } while (Traverse->_next != nullptr); List->_size = 0; List->_head = nullptr; return true; } template inline bool Empty(SinglyLinkedList* List) { return (List->_size == 0 && List->_head == nullptr); } template inline bool Remove(SinglyLinkedList* List, ListNode* node) { ListNode* Traverse = List->_head; ListNode* Previous = nullptr; while (Traverse != node) { Previous = Traverse; Traverse = Traverse->_next; } if (Traverse == List->_head) { return RemoveFirst(List); } if (Traverse->_next == nullptr) { return RemoveLast(List); } Previous->_next = Traverse->_next; Traverse->_next = nullptr; Traverse->_data = 0; List->_size--; return true; } template inline ListNode* Extract(SinglyLinkedList* List, const int Data) { ListNode* Temp = new ListNode{ 0, nullptr }; ListNode* Travel = nullptr; if (Empty(List)) { std::cout << "Empty list, nothing to extract!" << std::endl; return Temp; } for (Travel = List->_head; Travel->_data != Data && Travel->_next != nullptr;) { Travel = Travel->_next; } Temp->_data = Travel->_data; if (Remove(List, Travel)) { return Temp; } return nullptr; } #endif