컴공 일기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를 선물하세요.
-
자 여러분 모이세요 28 0
다 같이 한번 울고 갑시다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
-
타부운~ 1 1
와타시쟈나쿠테이이니~
-
사이테다 고만다 1 1
키미모민나돈요쿠다
-
자위하다쥐난적있냐 5 0
햄스트링이랑 종아리 씨발 난생처음보는고통이였다진짜씨발 소리지를라했는데 소리도안나오고
-
고속버스 여행이 재밌음 3 0
나중에 한 번 해보삼 고속 버스 타고 여행가는 낭만이 있음
-
아직 안자는 사람 18 0
궁금한게 있어
-
아오 2 0
ㅈㅏㅁ이안와
-
여사친이 톡으로 노노 거리길래 반가워서 "개웃기다노" 했더니 3 0
그런말이 있냐면서 너 원베냐면서 손절당함 ㅜ 너가 먼저 썼다노..
-
지2 매기분 1강-7강 (1~62) 1단원 전체 수강 완료 기하 시발점(이전에...
-
6모 수학 후기 0 0
작수 99 6모 96점(22) 22답 18썻는데 어케푸노 30분남음
-
애기 때 내가 바닷물을 다 삼켜버리는 상상을 하곤 했는데
-
제 남편 사진 공유합니다 2 0
-
시기별 좋아했던 가수/그룹들 2 0
2018(11살): 레드벨벳 2019(12살): 아리아나 그란데, 마룬파이브,...
-
카투사 기원 7+6일차 0 0
-
드디어 방학 시작이구나 2 0
고작 한달동안 성적 올리는건 기대하면 안되겠지
-
에너지드링크가 6 0
은근히돈이많이나가네
-
어삼쉬사 1 0
수학 안정 4등급이 목표인데요 현재 낮은4가 나옵니다 엔기출3점짜리는 다끝냈고요...
-
말도안돼 3 0
담배 안핀지 3주됨
-
수학 언제오르지 0 0
ㅠㅠ
-
비둘기야 밥 먹자 0 0
구구구구구
-
부모님 설득하는 법 좀 알려주셈 22 0
입시 컨설턴트를 받고 싶었는데 부모님은 내 성적이 안 좋아서 성적 올리는 게 먼저라...
-
디오더블쥐~ 1 0
스눕도기독
-
국어 감 다떨어졌다 1 1
빨리 나무위키 봐야함
-
오랜만이에요다들 8 3
요즘 오르비는 조용한가요?
-
수학 시간 부족 (고2) 3 0
고2 모고긴한데.. 항상 객, 서 끝번호 3~4개를 시간 부족해서 못품 어려운건...
-
수학 전국 서바 2회(스포O) 2 2
저도 서바 92첨 받아봐서 ㅁㅌㅊ 부남짤 찾을려는데 막상 안 보이네요 14,29틀...
-
고2 여름방학 국어 공부법 좀 알려주세요 선배님들 ㅠㅠ 1 0
지금 고2입니다! 현재 국어가 고3 모의고사도 80분내로 1등급이 안정권으로 뜨고...
-
국/수 테이블은 아침에 올려줄게염 계산기: https://suneungcalc.com/
-
공복이 너무 기니까 4 0
어지럽군나.. 최소한의 단백질이라도 채울까
-
집에잇으면계속집에잇고싶은데 2 3
집밖에나가면계속밖에있고싶어 아물론학교는예외임
-
빰빰빰 1 1
나는간다관독으로
-
국어 문학 2 0
강의 들어야할까요 독서같은건 고3꺼 정답률3,4,50프로되는거 맞는데 문학은...
-
인스타 보는데 2 2
우리 지역 명문고 탑텐에 왜 우리 학교가 있음 기분은 좋지만 사실이 아닌걸 학평...
-
씻기 싫어서 밖에 안나갈려교 5 0
하아..
-
아르기닌이랑 비타민B 맞지? 4 0
대충 뇌에 좋은 영양제 맞지?
-
뭘 하고싶지 2 0
긴가민가하네
-
개빡치네 1 0
고1 1학기 1.29 인데 9등급제로 계산해도...
-
수바 2회 3 1
ㄹㅇ 개쳐어렵네 이렇게 나오면 수능 1컷 70점대도 되겠다 ㅅㅂ 14,15틀 함...
-
동창회에 갓더니 4 5
다들 나랑 동갑이엇음 신기허네
-
인생이 어디로 가는거지 3 2
ㅈ된거같은데
-
일반고 2.0이고 생명계열 지망해요 (근데 수과학 성적이 엄청 좋은 편은 아니고...
-
수학 n제 뭐이리 어려움 0 1
본인 3모 5모 6모 7모 다 1등급이고 6모 1뜨고 나서 2,3등급도 n제 풀길래...
-
250929 기하 1 0
한완기 해설 1 2 둘다 나처럼 안풀었네.. 난 이게 가장 괜찮은 풀이 같은데
-
사문 오늘은 진짜 시작해야하나 4 2
ㅈㄴ 귀찮은데 리프레쉬 느낌으로 해야갯노
-
대성 교재패스 배송비 1 1
교재패스까지 꾸역꾸여 배송비받는거 역하네
-
수능수학전문과외 - 수능 때 6모보다 성적이 오르지 않으면 전액 환불해드립니다. 0 0
수능 때 6모보다 성적이 오르지 않으면 전액 환불해드립니다. 메가 대성 등 대형사...
-
이번주 금요일 7섶 1 1
모고친날은 잇올 칼퇴가능하던데
-
수학 기출 추천해주세요 3 0
재수중이고 목표는 4등급입니다 수학 기출문제집 추천해주세요 연도별 기출을 풀까요...
-
이승모쌤 생신축하드려요!!! 1 1

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