일지

자료구조...31

niamdank 2020. 11. 8. 16:21

데이터 삭제 메서드 구현

데이터 삭제 연산에 필요한 메서드들을 구현한다.

 

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;
}