컴공 일기199
게시글 주소: https://dev.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 1
1주마다 문제집 제끼고 오르비에 인증하기 앉아있는 시간은 같지만 공부량 ㅈㄴ 늘어난게 체감이 됨
-
윤사 코드원 샀음 1 2
윤사 개박살 났으니까 그래도 김종익 플러스 해서 코드원까지 하려고..
-
전화하고싶다 3 0
누구든좋으니까
-
작년에 2 0
2월부터 수능까지 새르비에 항상 있었던 사람이 있음
-
소아과 의사 누구였지 6 0
오르비언 ㅇㅅㅇ
-
한 달 뒤 새르비 상황 1 3
제목:진짜 다 뒤1졌냐? 2분전 조회수 8 작성자 수능 ㅈ된 설의적표현 내용:
-
???
-
수1 자작 0 1
수열 문제입니다. 거의 국밥 유형인 케이스 분류 문제에요. 오류 발견하시면...
-
아빠 안잔다 2 1
채널 돌리지 마라
-
유튜브하나보고 1 1
마저공부해야지
-
머리 안돌아가서 인강듣는데 2 0
인강도 내용이 잘 안들어옵니다.. 이럴땐 걍 자고 내일할까요?
-
저 누군지 모름? 1 1
구름과자임;;
-
죽었다. 0 0
새르비
-
치통에 4 2
잠을못자는중이에요.. 신경치료각이내
-
유빈이 진짜 야함.. 1 1
거꾸로 하면 빈유임.. 개좋네
-
이원준쌤 문학 괜찮나요? 1 0
ㅈㄱㄴ
-
햄버거 먹음 청년 2 1
슈슈버거세트
-
1회는 13,14 잘 넘기면 어찌어찌 40 중후반대까지 갈 수는 있는데 2회 <-...
-
수행평가로 책 소개하기가 있습니다. 식자경을 희망하고 있어요 책 추천해주실수 있나요
-
실모 만들면 출제자가 시간 세팅해서 딱 올려두고 시간 되면 참여자들이 맞춰서 푼...
-
수학 강사 추천 0 0
수리논술 할거라 미적, 확통, 기하 다 할건데 김범준 VS 정병호 (김범준은 기하...
-
쿠팡플레이 F1 해설위원인 윤재수 해설위원이 서울대 화학과 출신인데... 0 0
서울대 화학부 91학번인데, 1지망을 물리학과(현 물리천문학부 물리학전공) 2지망을...
-
오르비 흰바탕이 왼눈으론 뻘겋고 오른눈으론 누럼
-
차엿어요.. 3 1
...
-
3모 예상등급 0 0
33343정도…국어는 기출 풀기 시작한지 얼마 안 됐고 수학은 미적개념 돌리는...
-
기하러분들 0 0
서프 10번 내적으로 푸시려나
-
컨디션 좋은 상태로 독서실 다시 가고싶어
-
남은게돈뿐이구나 1 0
사람도사랑도식어감…
-
당분간 사립니다
-
난너무간지나서개명신청햇어김간지 0 0
역시난비주류야킥킥
-
지금까지 과학문제집 푼거 제외로 추천하는거있나요? 2 1
기출픽 1등급만들기 오투(개념으로씀) 완자(추가) 메가스터디 N제 자이스토리...
-
맞팔구 0 0
ㅇㅇ
-
반 단톡에서 생일인 사람들 축하해 주던데 그들은 헛걸음질을 하게 될것입니다 ㅋ
-
근데 부엉이껀 챙기면 진짜 개추 ㅋㅋ
-
화작에 2사탐 기준으로요 고대가 표점본다고하긴하던데 백분위로 대충 봐주실수있으신가요...
-
예체능 재순데 올해도 수학 유기하고 수능보면 평생 아쉬울것같아서 수학 지금 시작하고...
-
하쿠 1 0
들으샘
-
내가 그러고 있음 개찐따샛기..
-
이거 대략 현 예상 내 등급 1 2
아마 11313? 아니면 11314? 일듯. 아직 영어는 안 풀긴 했지만. 설마...
-
[Zola] 3월 교육청 대비 0 2
Zola임당. 3월 교육청 대비의 의미없음에 대해서는 아래 영상에서 말씀을...
-
사탐런 고민 3 1
현역이고 작수 물지 당일에 모의수능으로 학원가서쳤을때 2/1떴었는데 사탐런하면...
-
사실 저는 어제 생일이였습니다 왜 말하지 않았냐고요? "모두가 날 신경쓰는척 행동하는게 역겨우니까"
-
옯창 리스트 2 3
-
3월 더프 미적 4 1
21 22 30 틀려서 88점이네
-
과학 문제집중에 7 2
가장 어려운거 뭐임요??
-
야 신난다!
-
자꾸 간봐서 그렇긴 한데 3모 기간이 일정이 뭐가 많아서 아무도 안 볼거면 시간...
-
진지한 국어 질문 7 1
현역때 국어 안했고, 올해 3월에 처음 시작했습니다.선택은 화작목표는 6월에 3등급...
-
[이벤트] 2027학년도 Prologue 모의고사 1회 배포 19 12
OMR 링크:...
-
이제 심판의 시간이 다가왔다 5 2
더프 수학 채점해야 함.

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