링크드리스트 오름차순으로 insert하기

조회수 952회

제가 지금 c++로 single linked list를 공부하고 있습니다. 오름차순으로 값을 insert하고싶은데 자꾸 오류가 뜹니다. 1을 넣고 0을 넣는 경우는 잘 작동 되지만, 0을 넣고 1을 넣는 경우 작동하지 않습니다. 아마 if (p == NULL) 이 부분이 작동되지 않아서 문제 인거 같은데 왜 안돌아 가는지 모르겠습니다. 도와주시면 감사하겠습니다.

#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* next;
};

class List {
private:
    Node* head;
public:
    List() {
        head = 0;
    }
    void insert(int data) {
        Node* temp = new Node;
        temp->data = data;
        temp->next = 0;
        Node* p, * q;
        if (head == 0) {
            head = temp;
        }
        else if (temp->data < head->data) {
            temp->next = head;
            head = temp;
        }
        else {
            p = head;
            q = head;
            while ((p->data <= temp->data) and (p != 0)) {
                q = p;
                p = p->next;
            }
            if (p == 0) {
                p->next = temp;
            }
            else {
                temp->next = p;
                q->next = temp;
            }
        }
    }
    void display() {
        if (head == 0) {
            cout << "list is empty";
        }
        else {
            Node* p;
            p = head;
            while (p != 0) {
                cout << p->data;
                p = p->next;
            }
            cout << endl;
        }
    }
};
int main() {
    List a;
    a.insert(0);
    a.insert(1);
    a.display();
}

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    오류가 발생했을 때 어떤 오류가 발생하였는지도 같이 말씀해 주시면 좋겠습니다.

    아래와 같은 런타임 오류가 발생하는 것으로 보입니다.

    signal: segmentation fault (core dumped)
    

    세그멘테이션 폴트는 잘못된 메모리 주소에 접근했을 때 주로 발생합니다.

    while ((p->data <= temp->data) and (p != 0)) 을 보면 p가 널인지 아닌지 확인하면서 순회를 하려는 의도로보입니다. &&는 왼쪽에서 오른쪽으로 처리됩니다. 따라서 p가 널이여도 p->data 식이 수행되어 잘못된 메모리 주소에 접근하게 됩니다. (p != 0) and (p->data <= temp->data)로 변경해야합니다.

    if (p == 0)
    {
        p->next = temp;
    }
    

    이 코드를 보면 p가 널일 때 next에 접근하게 됩니다. 널포인터에 접근하면 잘못된 메모리 주소접근이기에 런타임 오류가 발생합니다.


    참고로 and는 C++ 표준 상 지원하는 연산자이지만 의외로 지원하지 않는 컴파일러가 더러 있습니다. 그러니 대체연산자 말고 &&를 사용하심이 좋습니다.

    • 순서도 중요한지 처음 알았네요.. 답변 감사드립니다! 성창엽 2020.4.21 00:09

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

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

(ಠ_ಠ)
(ಠ‿ಠ)