Advertisement
Cinestra

Project 2 done before changing the Insert

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