Advertisement
Cinestra

Project 2 -- Insertion doesn't work after swap

Feb 28th, 2023
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.78 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. insertBefore(closestNode, value);
  131. return true;
  132. }
  133.  
  134. void Set::actualErase(Node* p)
  135. {
  136. if (m_size == 1)
  137. {
  138. p->m_next = p->m_prev = nullptr;
  139. }
  140.  
  141. else if (p == m_head)
  142. {
  143. m_head = m_head->m_next;
  144.  
  145. p->m_next->m_prev = nullptr;
  146. }
  147.  
  148. else if (p == m_tail)
  149. {
  150. m_tail = m_tail->m_prev;
  151.  
  152. p->m_prev->m_next = nullptr;
  153. }
  154.  
  155. else
  156. {
  157. p->m_prev->m_next = p->m_next;
  158. p->m_next->m_prev = p->m_prev;
  159. }
  160.  
  161. delete p;
  162. m_size--;
  163. }
  164.  
  165. bool Set::erase(const ItemType& value)
  166. {
  167. Node* closestNode = findClosestLocation(value);
  168.  
  169. if (closestNode->m_value != value)
  170. return false;
  171.  
  172. actualErase(closestNode);
  173. return true;
  174. }
  175.  
  176. Set::~Set()
  177. {
  178. while (m_size > 1)
  179. {
  180. actualErase(m_head->m_next);
  181. }
  182.  
  183. delete m_head;
  184. }
  185.  
  186. void Set::printLinkedList()
  187. {
  188. Node* traversalNode = m_head;
  189.  
  190. while (traversalNode != nullptr)
  191. {
  192. std::cout << traversalNode->m_value << " ";
  193. traversalNode = traversalNode->m_next;
  194. }
  195.  
  196. std::cout << "\n";
  197. }
  198.  
  199. bool Set::contains(const ItemType& value) const
  200. {
  201. Node* closestNode = findClosestLocation(value);
  202. return (closestNode->m_value == value);
  203. }
  204.  
  205. bool Set::get(int i, ItemType& value) const
  206. {
  207. if (i < 0 || i >= m_size)
  208. return false;
  209.  
  210. Node* traversalNode;
  211.  
  212. // Closer to head
  213. if (i < (m_size / 2))
  214. {
  215. traversalNode = m_head;
  216. for (int j = 0; j != i; j++)
  217. {
  218. traversalNode = traversalNode->m_next;
  219. }
  220. }
  221.  
  222. // Closer to tail
  223. else
  224. {
  225. traversalNode = m_tail;
  226. for (int j = m_size - 1; j != i; j--)
  227. {
  228. traversalNode = traversalNode->m_prev;
  229. }
  230. }
  231.  
  232. value = traversalNode->m_value;
  233. return true;
  234. }
  235.  
  236. void Set::swap(Set& other)
  237. {
  238. Node* tempHead = other.m_head;
  239. other.m_head = m_head;
  240. m_head = tempHead;
  241.  
  242. Node* tempTail = other.m_tail;
  243. other.m_tail = m_tail;
  244. m_tail = tempTail;
  245.  
  246. int tempSize = other.m_size;
  247. other.m_size = m_size;
  248. m_size = tempSize;
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement