개발자 블로그

[Linked List Stack]Pop함수 구현시 TopNode, HeadNode 처리 본문

자료구조_구현시 실행착오 정리

[Linked List Stack]Pop함수 구현시 TopNode, HeadNode 처리

youngsunny 2024. 4. 25. 01:19
Node* LLS_Pop(LinkedListStack* Stack) {
    //1. 최상위 노드의 주소를 다른 포인터에 복사
    //2. 새로운 최상위 노드(현재 최상위 노드)의 바로 아래(이전) 노드를 찾는다.
    //3. LinkedListStack 구조체의 Top 필드에 새로운 최상위 노드의 주소를 등록한다.
    //4. 1에서 포인터에 저장했던 예전 최상위 노드의 주소를 반환한다.    
    Node* TopNodePtr = Stack->tailNode;
    Node* CurrentNodePtr = Stack->headNode;
    while (CurrentNodePtr->nextNode != TopNodePtr) {
        CurrentNodePtr = CurrentNodePtr->nextNode;
    }
    Stack->tailNode = CurrentNodePtr;
    return TopNodePtr;
}

 

Node가 하나일 경우에 대해서 처리를 안함. 

하나일경우에는 Push함수에서 HeadNode, TopNode에 모두 동일한 주소값을 넣었던 상태이고

Next 값은 NULL 인상태임

 

따라서 Node 하나일 경우에 대해서 처리를 하려면

if( Stack->tailNode == Stack->tailNode  ) 조건을 넣고

NULL 로 만들어 놓고 리턴을 하면됨

 

2차 시도

 

Node* LLS_Pop(LinkedListStack* Stack) {
    //1. 최상위 노드의 주소를 다른 포인터에 복사
    //2. 새로운 최상위 노드(현재 최상위 노드)의 바로 아래(이전) 노드를 찾는다.
    //3. LinkedListStack 구조체의 Top 필드에 새로운 최상위 노드의 주소를 등록한다.
    //4. 1에서 포인터에 저장했던 예전 최상위 노드의 주소를 반환한다.    
    Node* TopNodePtr = Stack->tailNode;    
    //Node 가 하나인 경우 확인
    if(Stack->headNode == Stack->tailNode){
        //Node 정보 삭제    
        Stack->headNode = NULL;
        Stack->tailNode = NULL;
    }else{
        //Node 정보가 여러개인 경우
        //최상위 노드값을 따로 저장해놓고
        //바로 직전의 노드 주소를 찾아서 Stack->tailNode 주소를 변경한다.
        Node* CurrentNodePtr = Stack->headNode;
        while (CurrentNodePtr->nextNode != TopNodePtr) {
            CurrentNodePtr = CurrentNodePtr->nextNode;
        }
        Stack->tailNode = CurrentNodePtr;
    }      
    return TopNodePtr;
}

 

또 틀린 내용, 마지막 쯤에서 tailNode(TopNode)의 Next값을 Null로 변경해줘야 하는점을 놓침(마지막에서 3번째 줄)

Node* LLS_Pop(LinkedListStack* Stack) {
    //1. 최상위 노드의 주소를 다른 포인터에 복사
    //2. 새로운 최상위 노드(현재 최상위 노드)의 바로 아래(이전) 노드를 찾는다.
    //3. LinkedListStack 구조체의 Top 필드에 새로운 최상위 노드의 주소를 등록한다.
    //4. 1에서 포인터에 저장했던 예전 최상위 노드의 주소를 반환한다.    
    Node* TopNodePtr = Stack->tailNode;
    //Node 가 하나인 경우 확인
    if(Stack->headNode == Stack->tailNode){
        //Node 정보 삭제    
        Stack->headNode = NULL;
        Stack->tailNode = NULL;
    }else{
        //Node 정보가 여러개인 경우
        //최상위 노드값을 따로 저장해놓고
        //바로 직전의 노드 주소를 찾아서 Stack->tailNode 주소를 변경한다.
        Node* CurrentNodePtr = Stack->headNode;
        while (CurrentNodePtr->nextNode != TopNodePtr) {
            CurrentNodePtr = CurrentNodePtr->nextNode;
        }
        Stack->tailNode = CurrentNodePtr;
        //2024.04.25.
        //또 틀린 내용, 마지막 쯤에서 tailNode(TopNode)의 Next값을 Null로 변경해줘야 하는점을 놓침
        Stack->tailNode->nextNode = NULL;
    }      
    return TopNodePtr;
}