Advertisement
Cinestra

Project 2 fixing bugs with erase

Feb 28th, 2023
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.87 KB | None | 0 0
  1. #include "Set.h"
  2. #include <iostream>
  3.  
  4. void Set::initializeEmptySet()
  5. {
  6. m_size = 0;
  7.  
  8. m_head = new Node;
  9. m_tail = m_head;
  10. m_head->m_next = nullptr;
  11. m_head->m_prev = nullptr;
  12. }
  13.  
  14. Set::Set()
  15. {
  16. initializeEmptySet();
  17. }
  18.  
  19. // Before we can actually insert the node, we need to implement the insert before function
  20.  
  21. void Set::insertNewHead(const ItemType& value)
  22. {
  23. Node* new_head = new Node;
  24. new_head->m_value = value;
  25.  
  26. m_head->m_prev = new_head;
  27. new_head->m_prev = nullptr;
  28. new_head->m_next = m_head;
  29. m_head = new_head;
  30.  
  31. m_size++;
  32. }
  33.  
  34. void Set::insertNewTail(const ItemType& value)
  35. {
  36. if (m_head == nullptr)
  37. insertNewHead(value);
  38.  
  39. else
  40. {
  41. Node* traversal_node = m_head;
  42. while (traversal_node->m_next != nullptr)
  43. {
  44. traversal_node = traversal_node->m_next;
  45. }
  46.  
  47. Node* new_tail = new Node;
  48. traversal_node->m_next = new_tail;
  49. new_tail->m_value = value;
  50. new_tail->m_prev = traversal_node;
  51. new_tail->m_next = nullptr;
  52. m_tail = new_tail;
  53. }
  54.  
  55. m_size++;
  56. }
  57.  
  58. void Set::insertBefore(Node* p, const ItemType& value)
  59. {
  60. //Create a new node
  61.  
  62. Node* new_pointer = new Node;
  63. new_pointer->m_value = value;
  64.  
  65. if (p == m_head)
  66. {
  67. insertNewHead(value);
  68. return;
  69. }
  70.  
  71. // Set the new pointer's previous pointer equal to p's previous pointer
  72. // Then set the new pointer's next pointer equal to p
  73. new_pointer->m_prev = p->m_prev;
  74. new_pointer->m_next = p;
  75.  
  76. // We must now make the previous nodes point to this new node
  77. // Then we must make the next node have its previous point to this node.
  78. new_pointer->m_prev->m_next = new_pointer;
  79. new_pointer->m_next->m_prev = new_pointer;
  80.  
  81. m_size++;
  82. }
  83.  
  84. // I have no idea how to write these function parameters
  85. // Why is there a Set:: before declaring a node pointer?
  86. // Is it because we can only define what a node pointer is after defining it's from the Set class?
  87. Set::Node* Set::findClosestLocation(const ItemType& value) const
  88. {
  89. Node* p = m_head;
  90.  
  91. while (p->m_next != nullptr && p->m_value < value)
  92. {
  93. p = p->m_next;
  94. }
  95.  
  96. return p;
  97. }
  98.  
  99. bool Set::insert(const ItemType& value)
  100. {
  101. Node* closestNode = findClosestLocation(value);
  102.  
  103. // When we are inserting a new head into an empty linkedList we should also initialize the tail.
  104. if (m_size == 0)
  105. {
  106. insertNewHead(value);
  107. m_tail = m_head;
  108. return true;
  109. }
  110.  
  111. // First check if we already have that value in our linked list
  112. else if (closestNode->m_value == value)
  113. {
  114. return false;
  115. }
  116.  
  117. // Then if it's closest node is the tail, we'll check if it should go before or after the tail
  118. // If we need to create a new tail, then we'll run that function
  119. // If not, we can actually just insert it before the tail (and run it like everything else)
  120. else if (closestNode == m_tail)
  121. {
  122. if (closestNode->m_value > m_tail->m_value)
  123. {
  124. insertNewTail(value);
  125. return true;
  126. }
  127. }
  128.  
  129. // insertBefore command actually checks if it should be a new head
  130. else
  131. {
  132. insertBefore(closestNode, value);
  133. return true;
  134. }
  135. }
  136.  
  137. void Set::actualErase(Node* p)
  138. {
  139.  
  140. if (m_size == 1)
  141. {
  142. p->m_next = p->m_prev = nullptr;
  143. }
  144.  
  145. else if (p == m_head)
  146. {
  147. m_head->m_next = m_head;
  148.  
  149. p->m_next->m_prev = nullptr;
  150. }
  151.  
  152. else if (p == m_tail)
  153. {
  154. m_tail->m_prev = m_tail;
  155.  
  156. p->m_prev->m_next = nullptr;
  157. }
  158.  
  159. else
  160. {
  161. p->m_prev->m_next = p->m_next;
  162. p->m_next->m_prev = p->m_prev;
  163. }
  164.  
  165. delete p;
  166. m_size--;
  167. }
  168.  
  169. bool Set::erase(const ItemType& value)
  170. {
  171. Node* closestNode = findClosestLocation(value);
  172.  
  173. if (closestNode->m_value != value)
  174. return false;
  175.  
  176. actualErase(closestNode);
  177. return true;
  178. }
  179.  
  180. Set::~Set()
  181. {
  182. while (m_size > 1)
  183. {
  184. actualErase(m_head->m_next);
  185. }
  186.  
  187. delete m_head;
  188. }
  189.  
  190. void Set::printLinkedList()
  191. {
  192. Node* traversalNode = m_head;
  193.  
  194. while (traversalNode != nullptr)
  195. {
  196. std::cout << traversalNode->m_value;
  197. traversalNode = traversalNode->m_next;
  198. }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement