2012-03-30 6 views
1

링크 된 목록을 만들었고 노드의 값을 인쇄하려고 할 때 바인딩으로 NULL을 사용했지만 작동하지 않았습니다. 예를 들어 :이 코드를 실행하면 링크 된 목록 - 포인터

#include <iostream> 

typedef struct Node; 
typedef Node* Node_ptr; 
struct Node 
{ 
    int i; 
    Node_ptr next; 
}; 

int main() 
{ 
    Node_ptr ptr, head; 
    ptr = new Node; 
    head = ptr; 

    // load 
    for(int j = 0; j < 4; j++) 
    { 
     ptr->next = new Node; 
     ptr->i = j; 
     ptr = ptr->next; 
    } 

    // print 
    ptr = head; 
    while(ptr->next != NULL) 
    { 
     std::cout << "print: " << ptr->i << std::endl; 
     ptr = ptr->next; 
    } 
} 

그러나, 코드는 while 루프에서 무한 루프에 갇혀됩니다. 링크 된 목록이 단지 5 노드 길이라는 것을 결코 이해하지 못합니다. 나는 그것이 왜 일어나는 지 이해할 수 없다.

+0

유효한 C 또는 C++ 코드가 아닙니다. 세미콜론이없고 누락 된'typedef', 누락 된'} '... –

+0

NULL을 확인하고 있지만 어디에서 설정 했습니까? – tinman

+0

.. 그리고 그것을 고치면 디버깅을해야합니다. –

답변

5

당신은 포인터를 (NULL로) 초기화 할 필요가있을 것입니다. 그렇지 않으면 단지 가비지 만 포함 할 것이므로 유효 포인터로도 나타납니다. 예를 들어

: 당신은 명확하게 ptr->nextNULL 때까지 계속 그것을 코딩

for(j = 0; j < 4; j++) 
{ 
    ptr->next = new Node; 
    (ptr->next)->next = NULL; 
    ptr->i = j; 
    ptr = ptr->next; 
} 
+0

+1 문제의 원인을 확인하십시오. 그러나, 나는'(ptr-> next) -> next = NULL;'을 수동으로 설정하는 것보다는 생성자를 사용하는쪽으로 기울었다. –

+0

@ e.James POD 유형을 초기화하기 위해 생성자가 필요하지 않습니다. 내 제안을 참조하십시오. –

+0

@ 루시아 : 당신의 답을 upvoted,하지만 공정한, 생성자는 확실히 일을 적게 오류가 발생합니다 (OP가 자신의 타입이 어떤 이유로 C++ 03 POD가 필요하지 않는 한). – ildjarn

3
while(ptr->next != NULL) 

. 아마도 목록에있는 하나 이상의 항목에 대해 ptr->nextNULL으로 설정해야합니까? 이것이 C에서 memset(&object, 0, sizeof(object));까지 또는 C++에서 생성자를 갖는 것이 일반적입니다. 초기화

typedef struct Node 
{ 
    int i; 
    Node* next; 
    Node() : i(0), next(NULL) {} //prevents this problem 
} 
4

시도의 값은 Node :

ptr = new Node(); 

대신 그렇지 않으면

ptr = new Node; 

, 당신은 단지 일원에서 쓰레기를해야합니다.

+0

아, 그게 훨씬 간단한 해결책인가요? –