일지

자료구조...19

niamdank 2020. 10. 20. 22:03

생성자,자유 공간 리스트 구현

기본 생성자와 DoublyLinkedList를 인자로 받는 복사 생성자를 구현하고 노드의 메모리 할당과 해제를 최소화하기 위한 자유 공간 리스트를 구현한다.

 

DoublyLinkedList.cpp

/// <summary>
/// 비어있는 DoublyLinkedList를 생성한다.
/// </summary>
DoublyLinkedList::DoublyLinkedList()
	: m_count(0), m_head(nullptr), m_tail(nullptr), m_free(nullptr)
{
}

/// <summary>
/// 다른 SinglyLinkedList가 가지고 있는 노드를 복사해 SinglyLinkedList를 생성한다.
/// </summary>
/// <param name="other">기준이 될 DoublyLinkedList</param>
DoublyLinkedList::DoublyLinkedList(const DoublyLinkedList& other)
	: m_count(other.m_count), m_free(nullptr)
{
	DoublyLinkedListNode* curNode{ other.m_head };

	m_head = m_tail = PopNode(curNode->m_data);
	curNode = curNode->m_next;

	while (curNode != nullptr)
	{
		DoublyLinkedListNode* newNode{ PopNode(curNode->m_data) };
		m_tail->m_next = newNode;
		newNode->m_prev = m_tail;
		m_tail = newNode;
		curNode = curNode->m_next;
	}
}

/// <summary>
/// 메모리 누수를 막기 위해 동적 생성한 노드들을 제거한다.
/// </summary>
DoublyLinkedList::~DoublyLinkedList()
{
	while (m_head->m_next != nullptr)
	{
		m_head = m_head->m_next;
		delete m_head->m_prev;
	}
	delete m_head;

	while (m_free->m_next != nullptr)
	{
		m_free = m_free->m_next;
		delete m_free->m_prev;
	}
	delete m_free;
}

/// <summary>
/// 자유 공간 리스트에서 노드를 가져오거나 새로 생성한다.
/// </summary>
/// <param name="value">노드 생성시 초기값</param>
/// <returns>새 노드</returns>
DoublyLinkedListNode* DoublyLinkedList::PopNode(int value)
{
	DoublyLinkedListNode* newNode{ nullptr };
	if (m_free == nullptr)
	{
		newNode = new DoublyLinkedListNode(value);
	}
	else
	{
		newNode = m_free;
		newNode->m_data = value;
		newNode->m_prev = newNode->m_next = nullptr;

		m_free = m_free->m_next;
	}

	return newNode;
}

/// <summary>
/// 자유 공간 리스트에 제거된 노드를 저장한다.
/// </summary>
/// <param name="node">제거된 노드</param>
void DoublyLinkedList::PushNode(DoublyLinkedListNode* node)
{
	m_free->m_prev = node;
	node->m_next = m_free;
	m_free = node;
}