링크드리스트 오름차순으로 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 답변
-
오류가 발생했을 때 어떤 오류가 발생하였는지도 같이 말씀해 주시면 좋겠습니다.
아래와 같은 런타임 오류가 발생하는 것으로 보입니다.
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++ 표준 상 지원하는 연산자이지만 의외로 지원하지 않는 컴파일러가 더러 있습니다. 그러니 대체연산자 말고&&
를 사용하심이 좋습니다.
댓글 입력