데이터는 이렇게
값부분 |
---|
주소부분 |
이렇게 나뉜다.
그래서 "이진 탐색 트리"를 구현하는 와중에
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C74tree-6
#pragma once
#include <iostream>
#include <assert.h>
template <typename T1, typename T2>
struct Pair
{
T1 first; // 키값
T2 second; // 데이터
};
template <typename T1, typename T2>
struct BstNode
{
Pair<T1, T2> pair;
BstNode* parentNode;
BstNode* leftNode;
BstNode* rightNode;
};
template <typename T1, typename T2> // T1 키값, T2 실제 데이터를 가질 부분
class CBST
{
private:
BstNode<T1, T2>* m_rootNode; // root 노드 주소
int m_dataCount; // 데이터 갯수
public:
CBST()
:
m_rootNode(nullptr),
m_dataCount(0)
{
}
public:
bool insert(const Pair<T1, T2>& pair);
};
template<typename T1, typename T2>
inline bool CBST<T1, T2>::insert(const Pair<T1, T2>& _pair)
{
BstNode<T1, T2>* newNode = new BstNode<T1, T2>();
newNode->pair = _pair;
newNode->parentNode = nullptr;
newNode->leftNode = nullptr;
newNode->rightNode = nullptr;
// 루트노드가 없을 경우
if (nullptr == m_rootNode)
{
m_rootNode = newNode;
}
else // root Node가 아닐 경우
{
// 훼손될 가능성을 없애기 위한 지역변수
BstNode<T1, T2>* pNode = m_rootNode;
while (true)
{
if (pNode->pair.first < newNode->pair.first)
{
if (nullptr == pNode->rightNode)
{
pNode->rightNode = newNode;
newNode->parentNode = pNode;
break;
}
else
{
pNode = pNode->rightNode;
}
}
else if (pNode->pair.first > newNode->pair.first)
{
if (nullptr == pNode->leftNode)
{
pNode->leftNode = newNode;
newNode->parentNode = pNode;
break;
}
else
{
pNode = pNode->leftNode;
}
}
else // 같을 경우
{
return false;
}
}
}
// 데이터 증가
++m_dataCount;
return true;
}
지금 이렇게 막 물어보 했던 부분이
포인터 변수도 "데이터"라 주소부분과 값 부분을 가진다.
라는 점을 인지를 못하고 이해도 못했었다.
그래서 저런 "개소리"가 나오더라...
그럼 어디서 개소리가 나왔냐??
=>
BstNode<T1, T2>* pNode = m_rootNode;
while (true)
{
if (pNode->pair.first < newNode->pair.first)
{
if (nullptr == pNode->rightNode)
{
pNode->rightNode = newNode;
newNode->parentNode = pNode;
break;
}
else
{
pNode = pNode->rightNode;
}
}
지금 첫째줄에서
BstNode<T1, T2>* pNode = m_rootNode; // pNode와 m_rootNode의 자료형 타입은 같다.
이렇게 할당을 해주면 "나"는
포인터 변수는 주소를 담는 부분 밖에 없다고 생각하여
스택에
Stack Memory |
---|
pNode의 값 부분 : 0x100 |
pNode의 주소 부분 : 0x200 |
Stack Memory |
---|
m_rootNode의 값 부분 : 어딘가의 주소를 가르키는 중 |
m_rootNode의 주소 부분 : 0x100 |
이런식으로 쌓여있는데
while문 안에서 계속 돌면서
else
{
pNode = pNode->rightNode;
}
pNode를 수정을 하면 m_rootNode가 수정이 된다고 생각했었다.
같은 주소를 들고있어서
그런데 그게 아니라 0x200이라는 주소 안에서 값부분을 바꾸는 것이니까
m_rootNode의 값은 바뀌지 않는다.
그래서
"훼손 가능성을 배제 하기 위한" 지역변수인 pNode를 선언하여 사용한 것이다.