Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Set.h"
- void Set::initializeEmptySet()
- {
- m_size = 0;
- m_head = new Node;
- m_tail = m_head;
- m_head->m_next = nullptr;
- m_head->m_prev = nullptr;
- }
- Set::Set()
- {
- initializeEmptySet();
- }
- // Before we can actually insert the node, we need to implement the insert before function
- void Set::insertNewHead(const ItemType& value)
- {
- Node* new_head = new Node;
- new_head->m_value = value;
- m_head->m_prev = new_head;
- new_head->m_prev = nullptr;
- new_head->m_next = m_head;
- m_head = new_head;
- m_size++;
- }
- void Set::insertNewTail(const ItemType& value)
- {
- if (m_head == nullptr)
- insertNewHead(value);
- else
- {
- Node* traversal_node = m_head;
- while (traversal_node->m_next != nullptr)
- {
- traversal_node = traversal_node->m_next;
- }
- Node* new_tail = new Node;
- traversal_node->m_next = new_tail;
- new_tail->m_value = value;
- new_tail->m_prev = traversal_node;
- new_tail->m_next = nullptr;
- m_tail = new_tail;
- }
- m_size++;
- }
- void Set::insertBefore(Node* p, const ItemType& value)
- {
- //Create a new node
- Node* new_pointer = new Node;
- new_pointer->m_value = value;
- if (p == m_head)
- {
- insertNewHead(value);
- return;
- }
- // Set the new pointer's previous pointer equal to p's previous pointer
- // Then set the new pointer's next pointer equal to p
- new_pointer->m_prev = p->m_prev;
- new_pointer->m_next = p;
- // We must now make the previous nodes point to this new node
- // Then we must make the next node have its previous point to this node.
- new_pointer->m_prev->m_next = new_pointer;
- new_pointer->m_next->m_prev = new_pointer;
- m_size++;
- }
- // I have no idea how to write these function parameters
- // Why is there a Set:: before declaring a node pointer?
- // Is it because we can only define what a node pointer is after defining it's from the Set class?
- Set::Node* Set::findClosestLocation(const ItemType& value) const
- {
- Node* p = m_head;
- while (p->m_next != nullptr && p->m_value < value)
- {
- p = p->m_next;
- }
- return p;
- }
- bool Set::insert(const ItemType& value)
- {
- // First we will check the head
- if (value == m_head->m_value)
- return false;
- else if (m_size == 0 || value < m_head->m_value)
- {
- insertNewHead(value);
- if (m_size == 1)
- {
- m_tail = m_head;
- }
- return true;
- }
- // Then we will check the tail
- else if (value == m_tail->m_value)
- return false;
- else if (value > m_tail->m_value)
- {
- insertNewTail(value);
- m_size++;
- return true;
- }
- // Finally, we will try to insert in the middle of the list
- else
- {
- Node* closestNode = findClosestLocation(value);
- if (closestNode->m_value == value)
- return false;
- insertBefore(closestNode, value);
- return true;
- }
- }
- void Set::actualErase(Node* p)
- {
- if (m_size == 1)
- {
- p->m_next = p->m_prev = nullptr;
- m_head = m_tail = nullptr;
- }
- else if (p == m_head)
- {
- m_head->m_next = m_head;
- p->m_next->m_prev = nullptr;
- }
- else if (p == m_tail)
- {
- m_tail->m_prev = m_tail;
- p->m_prev->m_next = nullptr;
- }
- else
- {
- p->m_prev->m_next = p->m_next;
- p->m_next->m_prev = p->m_prev;
- }
- delete p;
- m_size--;
- }
- bool Set::erase(const ItemType& value)
- {
- if (m_head->m_value == value || m_tail->m_value == value)
- actualErase(value);
- else
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement