2012-03-30 2 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; 
    } 
} 

Однако, когда я запускаю этот код, он застревает в бесконечном цикле в то время цикла. Он никогда не понимает, что связанный список имеет длину всего 5 узлов, он просто продолжает двигаться. Я не понимаю, почему это происходит.

+0

Это недопустимый код C или C++. Там пропали точки с запятой, и бродячие 'typedef', missing'} '... –

+0

Вы проверяете NULL, но вы его установили в любом месте? – tinman

+0

..и когда вы исправили это, вам нужно выполнить некоторую отладку. –

ответ

5

Возможно, вам просто нужно инициализировать указатели (до NULL), иначе они просто будут содержать мусор и будут также отображаться как действительные указатели.

Например:

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

@ Luchian: Я поддержал ваш ответ, но, честно говоря, конструктор, несомненно, сделает вещи менее подверженными ошибкам (если только OP не хочет, чтобы его тип был C++ 03 POD по какой-то причине). – ildjarn

3
while(ptr->next != NULL) 

Вы четко закодировал продолжать до тех пор, пока ptr->nextNULL. Возможно, вы должны установить ptr->next в NULL хотя бы для одного элемента в списке? Вот почему в C обычно используется memset(&object, 0, sizeof(object));, или в C++, чтобы иметь конструктор.

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

Try значение инициализации вашего Node:

ptr = new Node(); 

вместо

ptr = new Node; 

В противном случае, вы будете просто мусор в члены.

+0

О, это гораздо более простое решение, не так ли? –

Смежные вопросы