#pragma once
// 노드 구조체 템플릿
template<typename T>
struct Node
{
T data;
Node<T>* prevNode; // 이전 노드의 주소
Node<T>* nextNode; // 다음 노드의 주소
Node()
: data()
, prevNode(nullptr)
, nextNode(nullptr)
{
}
Node(const T& data, Node<T>* prevNode, Node<T>* nextNode)
: data(data)
, prevNode(prevNode)
, nextNode(nextNode)
{
}
};
// 리스트 클래스 템플릿
template<typename T>
class LinkedList
{
private:
Node<T>* headNode; // 연결 리스트의 맨 앞의 노드
Node<T>* tailNode; // 연결 리스트의 맨 뒤의 노드
int dataCount; // 연결 리스트에 저장된 데이터의 개수
public:
void push_back(const T& data);
void push_front(const T& data);
public:
LinkedList();
~LinkedList();
};
// 연결 리스트 초기화
template<typename T>
LinkedList<T>::LinkedList()
: headNode(nullptr)
, tailNode(nullptr)
, dataCount(0)
{
}
// 동적 할당 메모리 해제
template<typename T>
LinkedList<T>::~LinkedList()
{
Node<T>* deleteNode = headNode;
while (deleteNode)
{
Node<T>* nextNode = deleteNode->nextNode;
delete deleteNode;
deleteNode = nextNode;
}
}
// 연결 리스트 뒤에 데이터 추가
template<typename T>
void LinkedList<T>::push_back(const T& data)
{
// 새로운 노드 생성
Node<T>* newNode = new Node<T>(data, tailNode, nullptr);
if (nullptr == headNode) // 연결 리스트에 아무런 데이터가 저장되어 있지 않은 경우
{
headNode = newNode;
tailNode = newNode;
}
else
{
tailNode->nextNode = newNode;
tailNode = newNode;
}
++dataCount;
}
// 연결 리스트 앞에 데이터 추가
template<typename T>
void LinkedList<T>::push_front(const T& data)
{
Node<T>* newNode = new Node<T>(data, nullptr, headNode);
headNode->prevNode = newNode;
headNode = newNode;
++dataCount;
}