내 소식

✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2022-11-03 13:08:52
조회수 3,671

컴공 일기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;

            }


        }

    }

}

rare-백예린입니다

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.

✨컴공주✨ [1052682]

쪽지 보내기


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