출력 부분에서 포인터가 갈 곳을 잃어 버립니다

조회수 820회
struct custom{
    custom* pLink;
    custom* pToFl;
    string name;

};
typedef struct portNode{
    int numberOfCus = 0;
    string flightName;
    custom headerNode;
    portNode* pLink;
}flight;

struct airport{
    int numberOfPort = 0;
    flight headerNode;
};

airport* createAirport(){
    airport* pReturn = NULL;

    pReturn = (airport*)malloc(sizeof(airport));

    if(pReturn != NULL){
        memset(pReturn, 0, sizeof(airport));
    }
    else{
        cout << "메모리 할당 실패" << endl;
        return NULL;
    }
    return pReturn;
}

void addFlight(airport* pList, string newFlightName){
    flight* pNewFlight = NULL;
    flight* pPreNode = NULL;

    if(pList != NULL){
        pPreNode = &(pList->headerNode);
        while(pPreNode->flightName != newFlightName){
            if(pPreNode -> flightName != newFlightName && pPreNode -> pLink == NULL){
                pNewFlight = new flight;
                pNewFlight -> flightName = newFlightName;
                pNewFlight -> pLink = NULL;

                pNewFlight -> pLink = pPreNode -> pLink;
                pPreNode -> pLink = pNewFlight;
            }
            pPreNode = pPreNode->pLink;
            pList->numberOfPort++;
        }
    }
}

void addCustomer(airport* pList, string newFlightName, string newName){

custom* pNewCustom = NULL;
    custom* pPreNode = NULL;
    flight* pNewFlight = NULL;

        pNewCustom = new custom;
        if(pNewCustom != NULL){
            pNewCustom -> pLink = pNewCustom;
            pNewCustom -> pToFl = pNewCustom;
            pNewCustom -> name = newName;

            pNewFlight = &(pList->headerNode);

            while(pNewFlight->flightName != newFlightName){
                pNewFlight = pNewFlight -> pLink;
            }

            pPreNode = &(pNewFlight->headerNode);


            pNewCustom -> pToFl = pPreNode;
            pNewCustom -> pLink = pPreNode -> pLink;
            pPreNode -> pLink = pNewCustom;
        }
    }
}

--------문제는 이 데이터를 출력하는 부분입니다-----------
void displayCustomer(airport* pList, string newFlightName){
flight* pNode = NULL;
custom* pCustom = NULL;

if(pList != NULL){
    pNode = (pList->headerNode.pLink);

    while(pNode->flightName != newFlightName){
        pNode = pNode -> pLink;
    }
    pCustom = pNode->headerNode.pLink;
    }
while(pCustom -> pLink != pCustom){
-----여기서 문제가 발생합니다------
    cout << pCustom->name << endl; //여기서 Thread 1: EXC_BAD_ACCESS (code=1, address=0xc) ##에러 코드가 뜹니다
    pCustom = pCustom->pLink;
}

}

int main() {
    airport* pList = NULL;
    int choice;
    string portName;
    string name;

    pList = createAirport();

    while(true){
        cout << "CHOICES:\n";
        cout << "1. Add an Airport\n";
        cout << "2. Find an Airport - Standard Looping\n";
        cout << "3. Exit Program\n";
        cout << "Enter your choice: ";
        cin >> choice; cout << "\n\n";

        switch(choice){
            case 1: cout << "Inserting Airport\n";
                cout << "portName: " << endl;
                cin >> portName;
                addFlight(pList, portName);
                cout << "name: " << endl;
                cin >> name;
                addCustomer(pList, portName, name);
                break;
            case 2: cout << "Finding Airport\n";
                cout << "portName: " << endl;
                cin >> portName;
                displayCustomer(pList, portName);
                break;
            case 3: cout << "Terminating......\n";
                exit(EXIT_SUCCESS);       break;
            default: cout << "Not Valid\n\n";break;
        }
    }
}
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 제시된 소스는 무엇을 하는 프로그램이며 사용한 os와 사용한 컴파일러와 버전 및 컴파일 옵션은 무엇인가요? 물론 오류 메세지로 약간의 유추는 됩니다. 윈도우에 VC 일 것 같네요. NULL 참조하는 것 같고요. 정영훈 2018.6.20 12:17
  • 비행기 예약 시스템 입니다. 공항과 이름을 입력하면 해당 공항에 추가되고 출력하게 되면 해당 공항에 있는 모든 명단이 출력됩니다. C++로 맥 OS에서 Xcode 사용중입니다. 알 수 없는 사용자 2018.6.20 22:28

1 답변

  • 어떤 프로그램을 짜고 있는지에 대한 설명과, 어떤 어려움를 겪고있는 지에 대한 것을 자세하게 적어주시면 답변하기 편할 것입니다.


    구조를 살펴보니 하나의 airport내에 다양한 port(flight)가 Linked List로 저장되며, 각각의 port(flight)에는 여러 custom이 Linked List로 저장되는 것 같군요.

    프로그램을 실행했을 때, 메인입력에서 1을 누르면 port(flight)명과 custom명을 입력할 수 있고, 2를 누르면 해당 port(flight)에 등록된 custom명을 모두 출력하는 프로그램을 짜고 계신것 같네요.


    void displayCustomer(airport* pList, string newFlightName){
        flight* pNode = NULL;
        custom* pCustom = NULL;
    
        if(pList != NULL){
            pNode = (pList->headerNode.pLink);
    
            while(pNode != NULL && pNode->flightName != newFlightName){
                pNode = pNode -> pLink;
            }
            if(pNode == NULL) // 해당 flightName이 리스트에 없는 경우 함수 종료
                return;
            else
                pCustom = pNode->headerNode.pLink;
        }
        while(pCustom != NULL){ //리스트의 마지막 노드까지만 접근
            cout << pCustom->name << endl;
            pCustom = pCustom->pLink;
        }
    }
    

    이렇게 고쳐보시기 바랍니다..

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)