원래는 node를 하나 만들어서 List와 Set,Map이 같이 사용하도록 하려했는데
당연하게도 둘이 사용해야 할 노드가 성격이 다르다.
그래서 Node를 외부로 빼서 TreeNode와 ListNode를 따로 만들어주었다. 하지만, 두 노드간의 일관적인 인터페이스가 있어야 양방향 이터레이터에서 동일한 방식으로 자료구조를 다룰 수 있기 때문에 Node라는 최상위 클래스를 만들어서 그 안에 순수 가상함수를 선언해놓고 이를 상속받도록 하였다.
#pragma once
template<typename DataType>
class Node
{
public:
virtual void operator=(const Node<DataType>* _Node) = 0;
virtual Node<DataType>* operator++() = 0;
virtual Node<DataType>* operator++(int) = 0;
virtual Node<DataType>* operator--() = 0;
virtual Node<DataType>* operator--(int) = 0;
virtual const DataType& Get() = 0;
};
template<typename DataType>
class ListNode : public Node<DataType>
{
public:
void operator=(const Node<DataType>* _Node)
{
const ListNode<DataType>* CastedNode = dynamic_cast<const ListNode<DataType>*>(_Node);
Data = CastedNode->Data;
PrevNode = CastedNode->PrevNode;
NextNode = CastedNode->NextNode;
}
ListNode<DataType>* operator++() override
{
*this = NextNode;
return this;
}
ListNode<DataType>* operator++(int) override
{
++(*this);
return PrevNode;
}
ListNode<DataType>* operator--() override
{
*this = PrevNode;
return this;
}
ListNode<DataType>* operator--(int) override
{
--(*this);
return NextNode;
}
const DataType& Get() override
{
return Data;
}
DataType Data;
ListNode<DataType>* PrevNode = nullptr;
ListNode<DataType>* NextNode = nullptr;
};
template<typename DataType>
class TreeNode : public Node<DataType>
{
public:
enum NodeColor
{
None,
Red,
Black,
};
void operator=(const Node<DataType>* _Node)
{
}
TreeNode<DataType>* operator++() override
{
return this;
}
TreeNode<DataType>* operator++(int) override
{
return nullptr;
}
TreeNode<DataType>* operator--() override
{
return nullptr;
}
TreeNode<DataType>* operator--(int) override
{
return nullptr;
}
const DataType& Get() override
{
return Data;
}
DataType Data;
NodeColor Color = NodeColor::None;
TreeNode<DataType>* Parent = nullptr;
TreeNode<DataType>* LeftChild = nullptr;
TreeNode<DataType>* RightChild = nullptr;
};
TreeNode는 아직 함수 구현은 하지 않은 상태이다. 먼저 Set을 만들고 그에 맞게 구조를 맞춰볼 생각이다.
'프로젝트 > STL 자료구조 구현' 카테고리의 다른 글
STL 자료구조 구현 (10) - Set 기능 일부 구현 (0) | 2024.09.15 |
---|---|
STL 자료구조 구현 (8) - 양방향 이터레이터 추가 및 List 구조 수정 (0) | 2024.09.13 |
STL 자료구조 구현 (7) - 예외 처리 구조 변경, List 일부 구현 (0) | 2024.09.10 |
STL 자료구조 구현 (6) - 이터레이터 구조 변경 (0) | 2024.09.09 |
STL 자료구조 구현 (5) - VectorBase 상속 및 멤버 함수 추가 (0) | 2024.09.05 |