-
데이터 삭제 메서드 구현
데이터 삭제 연산에 필요한 메서드들을 구현한다.
DoublyCircularLinkedList.cpp
/// <summary> /// DoublyCircularLinkedList에서 가장 처음 일치한 지정된 값을 포함한 노드를 제거한다. /// </summary> /// <param name="value">제거할 값</param> bool DoublyCircularLinkedList::RemoveFirst(int value) { bool foundNode{ false }; DoublyCircularLinkedListNode* curNode{ m_head }; if (m_head != nullptr) { do { if (curNode->m_data == value) { foundNode = true; break; } curNode = curNode->m_next; } while (curNode != m_head); } if (!foundNode) { return false; } Remove(curNode); return true; } /// <summary> /// DoublyCircularLinkedList에서 가장 처음 일치한 지정된 값을 포함한 노드를 제거한다. /// </summary> /// <param name="value">제거할 값</param> bool DoublyCircularLinkedList::RemoveLast(int value) { bool foundNode{ false }; DoublyCircularLinkedListNode* curNode{ m_tail }; if (m_tail != nullptr) { do { if (curNode->m_data == value) { foundNode = true; break; } curNode = curNode->m_prev; } while (curNode != m_tail); } if (!foundNode) { return false; } Remove(curNode); return true; } /// <summary> /// DoublyCircularLinkedList에서 지정된 노드를 제거한다. /// </summary> /// <param name="node">제거할 노드</param> void DoublyCircularLinkedList::Remove(const DoublyCircularLinkedListNode* node) { if (node == nullptr) { throw std::invalid_argument("node"); } bool foundNode{ false }; DoublyCircularLinkedListNode* curNode{ m_head }; if (m_head != nullptr) { do { if (curNode == node) { foundNode = true; break; } curNode = curNode->m_next; } while (curNode != m_head); } if (!foundNode) { throw std::out_of_range("node"); } DoublyCircularLinkedListNode* prevNode{ curNode->m_prev }; DoublyCircularLinkedListNode* nextNode{ curNode->m_next }; prevNode->m_next = nextNode; if (prevNode == m_tail) { m_head = nextNode; } nextNode->m_prev = prevNode; if (nextNode == m_head) { m_tail = prevNode; } if (m_head == m_tail && m_tail == curNode) { m_head = m_tail = nullptr; } PushNode(curNode); m_count--; } /// <summary> /// DoublyCircularLinkedList의 모든 노드를 제거한다. /// </summary> void DoublyCircularLinkedList::Clear() { if (m_head != nullptr) { DoublyCircularLinkedListNode* head{ m_head }; do { DoublyCircularLinkedListNode* curNode{ m_head }; m_head = m_head->m_next; PushNode(curNode); } while (m_head != head); } m_head = m_tail = nullptr; m_count = 0; }