일지

자료구조...25

niamdank 2020. 10. 29. 18:21

단일 원형 연결 리스트 구현

SinglyLinkedList를 변형하여 단일 원형 연결 리스트를 구현한다.

 

SinglyCircularLinkedList.h

#pragma once
#include <xutility>
#include <iostream>

struct SinglyCircularLinkedListNode
{
	SinglyCircularLinkedListNode() {}
	SinglyCircularLinkedListNode(int value) { m_data = value; }

	int m_data{ 0 };
	SinglyCircularLinkedListNode* m_next{ nullptr };
};

class SinglyCircularLinkedList
{
public:
#pragma region 생성자
	SinglyCircularLinkedList();
	SinglyCircularLinkedList(const SinglyCircularLinkedList& other);
	~SinglyCircularLinkedList();
#pragma endregion

#pragma region 속성
	const int Count() { return m_count; }
	SinglyCircularLinkedListNode& Front() { return *m_head; }
#pragma endregion

#pragma region 메서드
	void Add(int value);
	void Add(SinglyCircularLinkedListNode* node);
	void Insert(size_t index, int value);
	void Insert(size_t index, SinglyCircularLinkedListNode* node);

	bool Remove(int value);
	void Remove(const SinglyCircularLinkedListNode* node);
	void Clear();

	bool Contains(int value);
	bool Contains(const SinglyCircularLinkedListNode* node);
	SinglyCircularLinkedListNode* Find(int value);
	SinglyCircularLinkedListNode* FindLast(int value);
#pragma endregion

private:
#pragma region Class Util
	SinglyCircularLinkedListNode* PopNode(int value);
	void PushNode(SinglyCircularLinkedListNode* node);
#pragma endregion
	
private:
#pragma region 변수
	size_t m_count;
	SinglyCircularLinkedListNode* m_head;
	SinglyCircularLinkedListNode* m_tail;
	SinglyCircularLinkedListNode* m_free;
#pragma endregion
};

 

- 생성자, 소멸자 구현

 

SinglyCircularLinkedList.cpp

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

	SinglyCircularLinkedListNode* curNode{ other.m_head };
	SinglyCircularLinkedListNode* prevNode{ PopNode(curNode->m_data) };

	m_head = prevNode;
	curNode = curNode->m_next;

	while (curNode->m_next != other.m_head)
	{
		SinglyCircularLinkedListNode* newNode{ PopNode(curNode->m_data) };
		prevNode->m_next = newNode;
		prevNode = newNode;
		curNode = curNode->m_next;
	}
}

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

	while (m_free != nullptr)
	{
		SinglyCircularLinkedListNode* curNode{ m_free };
		m_free = m_free->m_next;
		delete curNode;
	}
}