컴공 일기199
게시글 주소: https://orbi.kr/00059142130
BinarySearchTree에서 삭제 기능을 구현한 것인데, 이런 코드는 짰을 때 혼이 나야 될 겁니다.
왜냐하면, 좋은 코드의 조건인 'Readability(가독성)'을 아주 현저하게 떨어뜨리기 때문에 그렇습니다.
C언어에는 포인터라는 문법이 있습니다. 문법적인 의미는, 직접적으로 메모리에 '접근'하여 내가 원하는 대로 그 메모리를 해석하고 변형할 수 있다는 것이지요. 그렇다면 포인터가 이중으로 있다면요? 벌써부터 숨이 막힙니다.
메모리의 메모리에 접근한다..?
그 메모리가 가리키는 또 다른 메모리에 접근한다는 맥락이 되어버리죠. 어떻습니까.
딱봐도, 직관적으로 이해하기가 굉장히 힘들어 질 뿐더러, 지시하는 쪽과 지시되는 쪽 사이의 관계 파악에서도 쉽지가 않지요?
결론. 더블 포인터는 웬만하면 안 쓰는 것이 맞습니다. 더블 포인터를 어쩔 수 없이 써야하는 상황이라면,
진짜 써야 되겠지만(시험에서 2차원배열의 인덱스를 이중 포인터로 가리키도록 할 때는 당연히 써야지요.)
어쩌면, 내가 처음부터 구조적으로 설계를 잘못했을 가능성이 굉장히 큽니다.
애초에 이 삭제 기능만 보더라도, 이렇게 복잡하게 더블 포인터를 써야할 이유가 전혀 없습니다.
다른 방식이 있다는 것이지요.
void BST_RemoveNode(BSTNode** Tree, int Target)
{
BSTNode* pTmp; BSTNode* Parent = NULL;
if (!Tree)
return;
else if (Target < (*Tree)->Data)
BST_RemoveNode(&(*Tree)->Left, Target);
else if (Target > (*Tree)->Data)
BST_RemoveNode(&(*Tree)->Right, Target);
//삭제할 노드를 찾은 케이스
else
{
//자식이 0명
if (!(*Tree)->Left && !(*Tree)->Right)
{
printf("Deleted Data %d\n", (*Tree)->Data);
free(*Tree);
*Tree = 0;
return;
}
//자식이 1명
else if( !(*Tree)->Left && (*Tree)->Right)
{
pTmp = *Tree;
*Tree = (*Tree)->Right;
printf("Deleted Data %d\n", pTmp->Data);
free(pTmp);
return;
}
else if ((*Tree)->Left && !(*Tree)->Right)
{
pTmp = *Tree;
*Tree = (*Tree)->Left;
printf("Deleted Data %d\n", pTmp->Data);
free(pTmp);
return;
}
//자식이 2명
else
{
BSTNode* RC = (*Tree)->Right;
if (!RC->Left)
{
(*Tree)->Data = RC->Data;
(*Tree)->Right = RC->Right;
printf("Deleted Data %d\n", RC->Data);
free(RC);
return;
}
else
{
while (1)
{
if (RC->Left)
{
Parent = RC;
RC = RC->Left;
}
else break;
}
(*Tree)->Data = RC->Data;
Parent->Left = RC->Right;
printf("Deleted Data %d\n", RC->Data);
free(RC);
return;
}
}
}
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
메시 2연 우승 ㄱㄱ 2 2
ㄱㄱㄱ
-
개꿀잼이었다 2 2
아스날 우승!!!!
-
4대2에서 4골을 더넣음 0 1
4대2시점에서 보기시작했는데 엄청났다
-
이제 고석현 경기로.. 0 0
-
점수예측 성공했으면 140배 0 0
10만원넣으면 1400 ㄷㄷ
-
레전드다 레전드
-
메시 멀티골이 되려나 0 1
스페인 수비 잘하던데 음바페가 결국 득점왕으로 가는건가 지금 메시8골 음바페 10골입니다
-
합쳐서 10골 ㄷㄷ 1 2
합쳐서...10....? 10....
-
6대4는 배당 몇배임? 1 2
5대3이 350배였다던데
-
총합 10골 0 1
난타전 미쳤군나
-
6대4 4 1
뭐야이게
-
5대4 ㅌㅋㅋㅋㅋㅋㅋ 0 1
이게 결승이었어야돼..
-
진짜 아직 모른다 1 0
5:4 ㅋㅋㅋㅋ 역대급 꿀잼경기
-
5대4 ㄷㄷ 1 0
1~3분남음
-
사카 헤트트릭 5대3 3 1
pk로 넣었어요 5대3 맞췄으면 300배입니다
-
뭐야 왜 3대4임 4 1
재익이햄 스토리보고 프랑스가 전의를 상실했구나..이러면서 오르비 켰는데 왜 0대4가...
-
얼버기 4 3
오늘은 큐어 에클레르 정체가 공개되는날
-
음바페 버닝 미쳤 3 1
4대0이 순식간에 4대3이 되네
-
아 삼사위전 진짜 재밌네 4 2
자꾸 골이터지네 ㅋㅋㅋㅋㅋ 전개 시원..
-
4대3 배당 85배 1 0
4대4무승부는 180배 양팀득점합 7+는 18배
-
이번 월드컵은 2 0
전반전은 질질 끌려다니다가 후반전에 돌변해서 역전승하는 그런 테마인가요?
-
음바페골 4대3 0 1
ㄷㄷ
-
국어 실모 작년것도 괜찮나요? 1 0
작년에 사놓고 안풀어서 그런데 연계된게 낫나요?
-
양팀 감독 수비 포기하긴 한듯 0 1
이게 축구지
-
이건 데샹이랑 음바페가 1 0
라커룸에서 빠따친거 말고는 설명이 안돼
-
프랑스 할 수 있으면서 3 2
살살 뛴거였네 ㅋㅋ
-
음바페 골ㄹㄹㄹㄹㄹㄹ 1 1
음바페원툴똥팀수준ㅋㅋㅋ
-
5대0은 350배 4대1, 4대2는 55배 5대1, 5대2는 190배
-
573년전 군자의 복수
-
ㅇㅂㄱ 2 0
오늘은 수탐 기출을 해볼거에요
-
오늘 2027 LEET 시험일이니 최상위권은 참조 0 1
법학적성시험(LEET) 공식 홈페이지:...
-
잉글랜드가 막강한건지 프랑스가 더럽게 못하는건지 3/4위전인 것치고는 경기 밸런스가...
-
축구 개꿀잼이농농 1 1
3,4위전이 역시 클럽전같애서 재밌음
-
프랑스는 3분만에 골먹었냐 6 1
진행중인 34위전 1대0 잉글리드중 잠깨서 스코어본거라 어떤판인진 모르겠움
-
목요일의 내가 4 2
금요일의 내가 토요일의 내가 오늘의 나에게 모든 임무를 떠넘겼다 남은 시간은...
-
근데 러닝하는 사람들 1 0
그 등줄기만 가리는 괴상망측한 옷을 입는 사람들이 있는데 저거 편하나? 오히려 신경쓰일거 같은데
-
얼버기 했습니다. 9 4
월드컵 3,4위 결정전 보고 하루를 시작해보아요
-
국어에서 변호사 탈락 수학에서 메디컬 탈락 문과에서 삼닉 탈락 그럼 남은게 공무원...
-
밤 샜네 3 2
이런
-
일어남 5 1
머여
-
그렇게 첫 하루를 시작하는 것이에요! 좋은 아침이에요!
-
ㅜㅜ 3 1
ㅜ
-
얼버기 4 1
-
잠이안오네 2 0
아.. 힘들다..
-
범작가 싫었는데 잘됐다 0 8
지금은 내려간 영상인가 제목이 바꼈나 수능도서 팔이면서 자기를 베스트셀러 작가가라고...
-
잘까말까 1 1
쿼티님 대답해줘요
-
거짓말 안하고 수완 뒤에 실모 푸는데 18부터 21까지를 다 실수해서 처틀림;;...
-
너넨 손가락 함부로 놀리지마라 2 1
약점잡히면 인생힘들다
-
언제자지 2 1
고민중
-
저건뭐 60훈 시즌2임? 0 3
BJ 0훈

첫번째 댓글의 주인공이 되어보세요.