ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조...31
    일지 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;
    }

     

    댓글

Designed by Tistory.