ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조...30
    일지 2020. 11. 6. 21:55

    데이터 삽입 메서드 구현

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

     

    DoublyCircularLinkedList.cpp

    /// <summary>
    /// DoublyCircularLinkedList의 시작 위치에 지정한 값이 포함된 새 노드를 추가한다.
    /// </summary>
    /// <param name="value">추가할 값</param>
    void DoublyCircularLinkedList::AddFirst(int value)
    {
    	DoublyCircularLinkedListNode* newNode{ PopNode(value) };
    	AddFirst(newNode);
    }
    
    /// <summary>
    /// DoublyCircularLinkedList의 시작 위치에 지정한 노드를 추가한다.
    /// </summary>
    /// <param name="node">추가할 새 노드</param>
    void DoublyCircularLinkedList::AddFirst(DoublyCircularLinkedListNode* node)
    {
    	if (node == nullptr || node->m_prev != nullptr || node->m_next != nullptr)
    	{
    		throw std::invalid_argument("node");
    	}
    
    	node->m_next = m_head;
    	if (m_head != nullptr)
    	{
    		m_head->m_prev = node;
    		m_head = node;
    	}
    	else
    	{
    		m_head = m_tail = node;
    	}
    
    	m_head->m_prev = m_tail;
    	m_tail->m_next = m_head;
    
    	m_count++;
    }
    
    /// <summary>
    /// DoublyCircularLinkedList의 끝 위치에 지정한 값이 포함된 새 노드를 추가한다.
    /// </summary>
    /// <param name="value">추가할 값</param>
    void DoublyCircularLinkedList::AddLast(int value)
    {
    	DoublyCircularLinkedListNode* newNode{ PopNode(value) };
    	AddLast(newNode);
    }
    
    /// <summary>
    /// DoublyCircularLinkedList의 끝 위치에 지정한 노드를 추가한다.
    /// </summary>
    /// <param name="node">추가할 새 노드</param>
    void DoublyCircularLinkedList::AddLast(DoublyCircularLinkedListNode* node)
    {
    	if (node == nullptr || node->m_prev != nullptr || node->m_next != nullptr)
    	{
    		throw std::invalid_argument("node");
    	}
    
    	node->m_prev = m_tail;
    	if (m_tail != nullptr)
    	{
    		m_tail->m_next = node;
    		m_tail = node;
    	}
    	else
    	{
    		m_head = m_tail = node;
    	}
    
    	m_head->m_prev = m_tail;
    	m_tail->m_next = m_head;
    
    	m_count++;
    }
    
    /// <summary>
    /// DoublyCircularLinkedList의 지정한 인덱스에 해당하는 위치에 지정한 값이 포함된 새 노드를 추가한다.
    /// </summary>
    /// <param name="index">값을 추가할 인덱스</param>
    /// <param name="value">추가할 값</param>
    void DoublyCircularLinkedList::Insert(size_t index, int value)
    {
    	DoublyCircularLinkedListNode* newNode{ PopNode(value) };
    	Insert(index, newNode);
    }
    
    /// <summary>
    /// DoublyCircularLinkedList의 지정한 인덱스에 해당하는 위치에 지정된 노드를 추가한다.
    /// </summary>
    /// <param name="index">새 노드를 추가할 인덱스</param>
    /// <param name="node">추가할 새 노드</param>
    void DoublyCircularLinkedList::Insert(size_t index, DoublyCircularLinkedListNode* node)
    {
    	if (index > m_count)
    	{
    		throw std::out_of_range("index");
    	}
    
    	if (node == nullptr || node->m_next != nullptr)
    	{
    		throw std::invalid_argument("node");
    	}
    
    	DoublyCircularLinkedListNode* curNode{ m_head };
    	DoublyCircularLinkedListNode* prevNode{ m_tail };
    	for (int i = 0; i < index; i++)
    	{
    		prevNode = curNode;
    		curNode = curNode->m_next;
    	}
    
    	node->m_prev = prevNode;
    	if (prevNode != nullptr)
    	{
    		prevNode->m_next = node;
    	}
    	node->m_next = curNode;
    	if (curNode != nullptr)
    	{
    		curNode->m_prev = node;
    	}
    
    	if (index == 0)
    	{
    		m_head = node;
    	}
    	if (index == m_count)
    	{
    		m_tail = node;
    	}
    
    	m_count++;
    }

     

    댓글

Designed by Tistory.