diff options
| author | reecepwarner <[email protected]> | 2024-05-29 12:44:24 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-05-29 12:44:24 -0700 |
| commit | a94e681196881e3f8fb18ecfd760ed3f59fa8ca1 (patch) | |
| tree | 46158946d1c7aa12c44acc6043bcc595523a0c88 /CST 126/Homework3 | |
| parent | homework2 completed (diff) | |
| download | homework-1-reecepwarner-a94e681196881e3f8fb18ecfd760ed3f59fa8ca1.tar.xz homework-1-reecepwarner-a94e681196881e3f8fb18ecfd760ed3f59fa8ca1.zip | |
Template node branch to Develop Branch (#3)
* init
* changes
* changes
* created insert and deletion functions
* unit testing homework3
* more unit tests
* unit tests added
* unit test and memory check added
* Template node
* essentially completed
---------
Co-authored-by: rPatrickWarner <[email protected]>
Diffstat (limited to 'CST 126/Homework3')
| -rw-r--r-- | CST 126/Homework3/Homework3.vcxproj | 7 | ||||
| -rw-r--r-- | CST 126/Homework3/Homework3.vcxproj.filters | 8 | ||||
| -rw-r--r-- | CST 126/Homework3/Node.hpp | 53 | ||||
| -rw-r--r-- | CST 126/Homework3/SinglyLinkedList.hpp | 240 | ||||
| -rw-r--r-- | CST 126/Homework3/main.cpp | 9 |
5 files changed, 309 insertions, 8 deletions
diff --git a/CST 126/Homework3/Homework3.vcxproj b/CST 126/Homework3/Homework3.vcxproj index 34e042a..0625066 100644 --- a/CST 126/Homework3/Homework3.vcxproj +++ b/CST 126/Homework3/Homework3.vcxproj @@ -70,6 +70,9 @@ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> </ImportGroup> <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IncludePath>C:\Users\rpwar\source\repos\CST126\homework-1-reecepwarner\CST 126\UnitTest1;$(IncludePath)</IncludePath> + </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <WarningLevel>Level3</WarningLevel> @@ -129,6 +132,10 @@ <ItemGroup> <ClCompile Include="main.cpp" /> </ItemGroup> + <ItemGroup> + <ClInclude Include="Node.hpp" /> + <ClInclude Include="SinglyLinkedList.hpp" /> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/CST 126/Homework3/Homework3.vcxproj.filters b/CST 126/Homework3/Homework3.vcxproj.filters index ce0c35c..6f86576 100644 --- a/CST 126/Homework3/Homework3.vcxproj.filters +++ b/CST 126/Homework3/Homework3.vcxproj.filters @@ -19,4 +19,12 @@ <Filter>Source Files</Filter> </ClCompile> </ItemGroup> + <ItemGroup> + <ClInclude Include="SinglyLinkedList.hpp"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="Node.hpp"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> </Project>
\ No newline at end of file diff --git a/CST 126/Homework3/Node.hpp b/CST 126/Homework3/Node.hpp new file mode 100644 index 0000000..1bfbff2 --- /dev/null +++ b/CST 126/Homework3/Node.hpp @@ -0,0 +1,53 @@ +#ifndef NODE_HPP +#define NODE_HPP + +namespace CST_126 +{ + template<typename T> + class Node + { + public: + Node() = default; + Node(const T& Data); + + ~Node() = default; + + + T& Data(); + T Data() const; + void Data(const T& Data); + + + private: + + T _data{ 0 }; + + }; + + template<typename T> + Node<T>::Node(const T& Data) : _data(Data) {}; + + template<typename T> + inline T& Node<T>::Data() + { + return _data; + } + + template<typename T> + inline T Node<T>::Data() const + { + return _data; + } + + template<typename T> + inline void Node<T>::Data(const T& Data) + { + _data = Data; + } + +} + + + + +#endif
\ No newline at end of file diff --git a/CST 126/Homework3/SinglyLinkedList.hpp b/CST 126/Homework3/SinglyLinkedList.hpp new file mode 100644 index 0000000..92f4a1f --- /dev/null +++ b/CST 126/Homework3/SinglyLinkedList.hpp @@ -0,0 +1,240 @@ +#ifndef SINGLY_LINKED_LIST_HPP +#define SINGLY_LINKED_LIST_HPP +#include <iostream> +#include "Node.hpp" +template<typename T> + struct ListNode + { + T _data{0}; + ListNode* _next {nullptr}; + }; + +template<typename T> +struct SinglyLinkedList +{ + size_t _size {0}; + + ListNode<T>* _head{ nullptr }; + +}; + + +template<typename T> +inline bool Append(SinglyLinkedList<T>* list, ListNode<T>* node) +{ + if (list->_size == 0) + { + list->_head = node; + list->_size++; + return true; + } + ListNode<T>* TraverseNode = nullptr; + for (TraverseNode = list->_head; TraverseNode->_next != nullptr;) + { + TraverseNode = TraverseNode->_next; + } + + TraverseNode->_next = node; + list->_size++; + return true; +} + +template<typename T> +inline bool Prepend(SinglyLinkedList<T>* list, ListNode<T>* node) +{ + if (list->_size == 0) + { + list->_head = node; + list->_size++; + return true; + } + node->_next = list->_head; + list->_head = node; + list->_size++; + return true; +} + +template<typename T> +inline bool RemoveFirst(SinglyLinkedList<T>* 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; + } + 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) +{ + 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<T>* TraverseNode = list->_head; + while (TraverseNode->_next->_next != nullptr) + { + TraverseNode = 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 = 1; 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) +{ + if (List->_head == nullptr) + { + Append(List, node); + return true; + } + ListNode<T>* Traverse = List->_head; + ListNode<T>* 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 <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); + } + + Previous->_next = Traverse->_next; + + 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; + + 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<T>(List, Travel)) + { + return Temp; + } + + return nullptr; +} + + +#endif
\ No newline at end of file diff --git a/CST 126/Homework3/main.cpp b/CST 126/Homework3/main.cpp index 6771ba7..fb631b8 100644 --- a/CST 126/Homework3/main.cpp +++ b/CST 126/Homework3/main.cpp @@ -2,18 +2,11 @@ //Date:5/8/24 //Assignment:Homework3 - +#include "SinglyLinkedList.hpp" int main(const int argc, char* argv[]) { - - - - - - - return 0; }
\ No newline at end of file |