일지

자료구조...18

niamdank 2020. 10. 18. 17:01

이중 연결 리스트 구현

단일 연결 리스트의 이해를 기반으로 C#의 LinkedList<T>를 간략화하여 int만 저장할 수 있는 DoublyLinkedList를 만든다.

 

구현이 필요한 메서드 및 속성은 다음과 같다.

 

  • 생성자
    • DoublyLinkedList() 비어있는 인스턴스 생성
    • DoublyLinkedList(DoublyLinkedList&) 다른 DoublyLinkedList 데이터로 인스턴스 생성
  • 속성 
    • Count 사용되고 있는 노드의 수
    • First 리스트의 처음 노드
    • Last 리스트의 마지막 노드
  • 메서드 
    • AddFirst(data) 시작 위치에 데이터를 포함한 노드 생성 후 삽입
    • AddFirst(node) 지정된 노드 삽입
    • AddLast(data) 시작 위치에 데이터를 포함한 노드 생성 후 삽입
    • AddLast(node) 지정된 노드 삽입
    • Insert(int, data) 지정된 위치에 데이터를 포함한 노드 생성 후 삽입
    • Insert(int, node) 지정된 위치에 지정된 노드 삽입
    • RemoveFirst(data) 가장 처음 일치한 데이터를 포함한 노드 삭제
    • RemoveLast(data) 가장 마지막 일치한 데이터를 포함한 노드 삭제
    • Remove(node) 지정된 노드와 동일한 노드 삭제
    • Clear() 모든 노드 삭제
    • Contains(data) 데이터를 포함한 노드의 존재 여부 확인
    • Contains(node) 지정된 노드의 존재 여부 확인
    • Find(data) 가장 처음 일치한 데이터를 포함하는 노드 반환
    • FindLast(data) 가장 마지막 일치한 데이터를 포함하는 노드 반환

 

DoublyLinkedList.h

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

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

	int m_data = 0;
	DoublyLinkedListNode* m_prev = nullptr;
	DoublyLinkedListNode* m_next = nullptr;
};

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

#pragma region 속성
	const int Count() { return m_count; }
	DoublyLinkedListNode& First() { return *m_head; }
	DoublyLinkedListNode& Last() { return *m_tail; }
#pragma endregion

#pragma region 메서드
	void AddFirst(int value);
	void AddFirst(DoublyLinkedListNode* node);
	void AddLast(int value);
	void AddLast(DoublyLinkedListNode* node);
	void Insert(int index, int value);
	void Insert(int index, DoublyLinkedListNode* node);

	bool RemoveFirst(int value);
	bool RemoveLast(int value);
	void Remove(const DoublyLinkedListNode* node);
	void Clear();

	bool Contains(int value);
	bool Contains(const DoublyLinkedListNode* node);
	DoublyLinkedListNode* Find(int value);
	DoublyLinkedListNode* FindLast(int value);

	void PrintInfo();
#pragma endregion

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