2016-08-26 2 views
-4

이것은 상당히 단순한 프로젝트이며, 약 20 시간을 아무런 진전없이 원을 그리면서 여행 한 것입니다. 나는 처음부터 바른 방향으로 가고있는 것처럼 보였습니다.하지만 저는 그것을 설명해 주려고했습니다. 그것은 제 뇌가 나를 정사각형으로 돌려 놓는 것을 뒤틀 었습니다.이 C++ 단순 연결 목록 구현의 문제점은 무엇입니까?

나는이 코드가 간단한 오류 일 가능성이 높으므로 설명과 함께 코드를 게시 할 것임을 알고 있습니다. 참고 : 어설 기능은

void Intset::insert(int key) 
{ 
    Node * current; 
    current->num = key; 
    current->next = NULL; 
    assert (!find(key)); 
    if(head == NULL) 
    { 
     head = current; 
    } 
    else if(head->num >= key) 
    { 
     head->next = head; 
     head = current; 
    } 
    else if(head->num < key) 
    { 
     head->next = current; 
    } 

그래서 (정렬 된 연결리스트에 삽입 키)이 기능을 뒤에 내 생각 프로세스를 만드는 것입니다

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

CPP는 파일 H 파일에 문제가

아니다 새 노드가 현재 입력되어 있고 num 필드를 사용자가 입력 한 키로 채우고 다음 필드가 NULL과 같습니다. 내 첫 번째 검사는 머리가 비어 있는지 여부와 현재의 내용을 복사하는지 확인하는 것입니다. 두 번째 검사는 head의 num 필드에 사용자가 입력 한 키보다 크거나 같은 숫자가 들어 있는지 확인하는 것입니다.

그렇다면 헤드 노드를 다음 노드로 이동하고 현재 노드 (앞에있는 작은 번호)로 바꿉니다. 세 번째 검사는 머리에있는 숫자가 사용자가 입력 한 키보다 작 으면보고 머리의 다음 필드를 현재로 채 웁니다 (작은 숫자가 먼저 나타남). 지금까지 seg fault 오류가 발생했으며 잘못 할당하고 있는지 확실하지 않습니다.

+0

새 노드의 메모리를 선언해야합니다. 그렇게 단순히 삽입 할 수는 없습니다. – Shravan40

+1

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+2

연결된 목록을 찾는 가장 좋은 방법은 연필과 종이를 사용하는 것입니다. 목록의 노드를 그립니다. 노드 사이의 연결을 그립니다. 그런 다음 목록 및 다른 관련 노드를 조작하여 삽입 및 제거 등의 작업을 수행하십시오. – user4581301

답변

3
여기에서 시작

:

Node * current; 
current->num = key; 
current->next = NULL; 

어디 current 점을합니까? 초기화되지 않은 포인터를 역 참조합니다. 이것은 undefined behavior이며 seg 오류가 발생할 수 있습니다.

+0

감사합니다. 벤이 여기에 필요한 새 기능입니다. 또는 단지 한 줄로 통합해야합니까? – Riossm

+0

@Riossm, 죄송합니다.하지만 내 대답에 따라 그 의견은 나에게 의미가 없습니다. 무슨 뜻입니까? –

+0

예. 현재 = 새 노드 (키, NULL); – Riossm

관련 문제