데이터

CJB_ny·2022년 7월 21일
0

C++ 정리

목록 보기
95/95
post-thumbnail

모든 데이터는 👍👍👍

데이터는 이렇게

값부분
주소부분

이렇게 나뉜다.

그래서 "이진 탐색 트리"를 구현하는 와중에


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를 선언하여 사용한 것이다.

profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글