일지
자료구조...26
niamdank
2020. 10. 31. 12:25
데이터 삽입 메서드 구현
데이터 삽입 연산에 필요한 메서드들을 구현한다.
SinglyCircularLinkedList.cpp
/// <summary>
/// SinglyCircularLinkedList의 시작 위치에 지정한 값이 포함된 새 노드를 추가한다.
/// </summary>
/// <param name="value">추가할 값</param>
void SinglyCircularLinkedList::Add(int value)
{
SinglyCircularLinkedListNode* newNode{ PopNode(value) };
Add(newNode);
}
/// <summary>
/// SinglyCircularLinkedList의 시작 위치에 지정한 노드를 추가한다.
/// </summary>
/// <param name="node">추가할 새 노드</param>
void SinglyCircularLinkedList::Add(SinglyCircularLinkedListNode* node)
{
if (node == nullptr || node->m_next != nullptr)
{
throw std::invalid_argument("node");
}
node->m_next = m_head;
UpdateHead(node);
m_count++;
}
/// <summary>
/// SinglyCircularLinkedList의 지정한 인덱스에 해당하는 위치에 지정한 값이 포함된 새 노드를 추가한다.
/// </summary>
/// <param name="index">값을 추가할 인덱스</param>
/// <param name="value">추가할 값</param>
void SinglyCircularLinkedList::Insert(size_t index, int value)
{
SinglyCircularLinkedListNode* newNode{ PopNode(value) };
Insert(index, newNode);
}
/// <summary>
/// SinglyCircularLinkedList의 지정한 인덱스에 해당하는 위치에 지정된 노드를 추가한다.
/// </summary>
/// <param name="index">새 노드를 추가할 인덱스</param>
/// <param name="node">추가할 새 노드</param>
void SinglyCircularLinkedList::Insert(size_t index, SinglyCircularLinkedListNode* node)
{
if (index > m_count)
{
throw std::out_of_range("index");
}
if (node == nullptr || node->m_next != nullptr)
{
throw std::invalid_argument("node");
}
SinglyCircularLinkedListNode* prevNode{ nullptr };
SinglyCircularLinkedListNode* curNode{ m_head };
while (index--)
{
prevNode = curNode;
curNode = curNode->m_next;
}
node->m_next = curNode;
if (prevNode != nullptr)
{
prevNode->m_next = node;
}
else
{
UpdateHead(node);
}
m_count++;
}
/// <summary>
/// 리스트의 head를 변경하고 리스트가 원형이 유지되도록 한다.
/// </summary>
/// <param name="node">head로 변경할 노드</param>
void SinglyCircularLinkedList::UpdateHead(SinglyCircularLinkedListNode* node)
{
if (node == nullptr)
{
throw std::invalid_argument("node");
}
SinglyCircularLinkedListNode* tail{ m_head };
if (tail != nullptr)
{
while (tail->m_next != m_head)
{
tail = tail->m_next;
}
}
m_head = node;
if (tail != nullptr)
{
tail->m_next = m_head;
}
else
{
m_head->m_next = m_head;
}
}