diff options
| author | rPatrickWarner <[email protected]> | 2024-05-22 19:07:00 -0700 |
|---|---|---|
| committer | rPatrickWarner <[email protected]> | 2024-05-22 19:07:00 -0700 |
| commit | 9f56dcbbf0f57dd00b60fbff4871adcf8bb3ddc8 (patch) | |
| tree | 87103f1b794f777e9697cf2ee32d2f398fde807f /CST 126/Homework3/SinglyLinkedList.hpp | |
| parent | more unit tests (diff) | |
| download | homework-1-reecepwarner-9f56dcbbf0f57dd00b60fbff4871adcf8bb3ddc8.tar.xz homework-1-reecepwarner-9f56dcbbf0f57dd00b60fbff4871adcf8bb3ddc8.zip | |
unit tests added
Diffstat (limited to 'CST 126/Homework3/SinglyLinkedList.hpp')
| -rw-r--r-- | CST 126/Homework3/SinglyLinkedList.hpp | 166 |
1 files changed, 154 insertions, 12 deletions
diff --git a/CST 126/Homework3/SinglyLinkedList.hpp b/CST 126/Homework3/SinglyLinkedList.hpp index c877ed1..06e5f08 100644 --- a/CST 126/Homework3/SinglyLinkedList.hpp +++ b/CST 126/Homework3/SinglyLinkedList.hpp @@ -16,6 +16,9 @@ struct SinglyLinkedList ListNode<T>* _head{ nullptr }; }; +//prototype all your functions! + + template<typename T> inline bool Append(SinglyLinkedList<T>* list, ListNode<T>* node) @@ -27,11 +30,13 @@ inline bool Append(SinglyLinkedList<T>* list, ListNode<T>* node) return true; } ListNode<T>* TraverseNode = nullptr; - for (TraverseNode = list->_head; TraverseNode->_next!= nullptr;) - { - TraverseNode = TraverseNode->_next; - } + for (TraverseNode = list->_head; TraverseNode->_next != nullptr;) + { + TraverseNode = TraverseNode->_next; + } + TraverseNode->_next = node; + list->_size++; return true; } @@ -52,7 +57,7 @@ inline bool Prepend(SinglyLinkedList<T>* list, ListNode<T>* node) } template<typename T> -inline bool RemoveFirst(SinglyLinkedList<T>* list, ListNode<T>* node) +inline bool RemoveFirst(SinglyLinkedList<T>* list) { if (list->_size == 0) { @@ -60,15 +65,25 @@ inline bool RemoveFirst(SinglyLinkedList<T>* list, ListNode<T>* node) return true; } - ListNode<T>* Temp = list->_head; - list->_head = node->_next; - list->_size--; - delete Temp; + if (list->_size == 1) + { + list->_head =nullptr; + } + else + { + + ListNode<T>* Temp = list->_head; + list->_head = list->_head->_next; + Temp->_next = nullptr; + + list->_size--; + } + return true; } template<typename T> -inline bool RemoveLast(SinglyLinkedList<T>* list, ListNode<T>* node) +inline bool RemoveLast(SinglyLinkedList<T>* list) { if (list->_size == 0) { @@ -77,7 +92,6 @@ inline bool RemoveLast(SinglyLinkedList<T>* list, ListNode<T>* node) } if (list->size == 1) { - delete list->_head; list->_head = nullptr; list->_size--; return true; @@ -87,10 +101,138 @@ inline bool RemoveLast(SinglyLinkedList<T>* list, ListNode<T>* node) { TraverseNode = TraverseNode->_next; } - delete TraverseNode->_next; TraverseNode->_next = nullptr; list->_size--; return true; } +template <typename T> +inline bool InsertAfter(SinglyLinkedList<T>* List, const int Data, ListNode<T>* node) +{ + if (List->_head == nullptr) + { + Append(List, node); + return true; + } + ListNode<T>* Traverse = List->_head; + for (auto i = 1u; i < Data && Traverse != nullptr; i++) + { + Traverse = Traverse->_next; + } + node._next = Traverse->_next; + + Traverse->_next = node; + List->_size++; + + return true; +} + +template <typename T> +inline bool InsertBefore(SinglyLinkedList<T>* List, const int Data, ListNode<T>* node) +{ + return false; +} + +template <typename T> +inline bool Clear(SinglyLinkedList<T>* List) +{ + if (List->_size == 0) + { + return true; + } + if (List->_size == 1) + { + List->_head = nullptr; + List->_size--; + return true; + } + ListNode<T>* Traverse = List->_head; + ListNode<T>* 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 <typename T> +inline bool Empty(SinglyLinkedList<T>* List) +{ + return (List->_size == 0 && List->_head == nullptr); +} + +template <typename T> +inline bool Remove(SinglyLinkedList<T>* List, ListNode<T>* node) +{ + + ListNode<T>* Traverse = List->_head; + ListNode<T>* Previous = nullptr; + while (Traverse != node) + { + Previous = Traverse; + Traverse = Traverse->_next; + } + if (Traverse == List->_head) + { + return RemoveFirst(List); + } + if (Traverse->_next == nullptr) + { + //return RemoveLast(List); + return true; + } + + Previous->_next = Traverse->_next; + + //"delete" Traverse + Traverse->_next = nullptr; + Traverse->_data = 0; + List->_size--; + + return true; +} + + + +template <typename T> +inline ListNode<T>* Extract(SinglyLinkedList<T>* List, const int Data) +{ + ListNode<T>* Temp = new ListNode<T>{ 0, nullptr }; + + ListNode<T>* Travel = nullptr; + //check if empty + 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; + + //read through list + //find data + //return pointer to the node + //remove node from list + if (Remove<T>(List, Travel)) + { + return Temp; + } + + return nullptr; +} + + #endif
\ No newline at end of file |