From 9f56dcbbf0f57dd00b60fbff4871adcf8bb3ddc8 Mon Sep 17 00:00:00 2001 From: rPatrickWarner Date: Wed, 22 May 2024 19:07:00 -0700 Subject: unit tests added --- CST 126/Homework3/SinglyLinkedList.hpp | 166 ++++++++++++++++++++++++++++++--- 1 file changed, 154 insertions(+), 12 deletions(-) (limited to 'CST 126/Homework3/SinglyLinkedList.hpp') 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* _head{ nullptr }; }; +//prototype all your functions! + + template inline bool Append(SinglyLinkedList* list, ListNode* node) @@ -27,11 +30,13 @@ inline bool Append(SinglyLinkedList* list, ListNode* node) return true; } ListNode* 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* list, ListNode* node) } template -inline bool RemoveFirst(SinglyLinkedList* list, ListNode* node) +inline bool RemoveFirst(SinglyLinkedList* list) { if (list->_size == 0) { @@ -60,15 +65,25 @@ inline bool RemoveFirst(SinglyLinkedList* list, ListNode* node) return true; } - ListNode* Temp = list->_head; - list->_head = node->_next; - list->_size--; - delete Temp; + if (list->_size == 1) + { + list->_head =nullptr; + } + else + { + + ListNode* Temp = list->_head; + list->_head = list->_head->_next; + Temp->_next = nullptr; + + list->_size--; + } + return true; } template -inline bool RemoveLast(SinglyLinkedList* list, ListNode* node) +inline bool RemoveLast(SinglyLinkedList* list) { if (list->_size == 0) { @@ -77,7 +92,6 @@ inline bool RemoveLast(SinglyLinkedList* list, ListNode* node) } if (list->size == 1) { - delete list->_head; list->_head = nullptr; list->_size--; return true; @@ -87,10 +101,138 @@ inline bool RemoveLast(SinglyLinkedList* list, ListNode* node) { TraverseNode = TraverseNode->_next; } - delete 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 = 1u; 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) +{ + return false; +} + +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); + return true; + } + + Previous->_next = Traverse->_next; + + //"delete" Traverse + 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; + //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(List, Travel)) + { + return Temp; + } + + return nullptr; +} + + #endif \ No newline at end of file -- cgit v1.2.3