Связанный список - указатели - PullRequest
1 голос
/ 31 марта 2012

Я создал связанный список, и когда я попытался напечатать значения узлов и использовал 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 узлов, он просто продолжает работать.Я не могу понять, почему это происходит.

Ответы [ 3 ]

5 голосов
/ 31 марта 2012

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

Например:

for(j = 0; j < 4; j++)
{
   ptr->next = new Node;
   (ptr->next)->next = NULL;
   ptr->i = j;
   ptr = ptr->next;
}
4 голосов
/ 31 марта 2012

Попробуйте значение инициализации вашего Node:

ptr = new Node();

вместо

ptr = new Node;

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

3 голосов
/ 31 марта 2012
while(ptr->next != NULL)

Вы четко закодировали его, чтобы продолжить, пока ptr->next не станет NULL. Может быть, вы должны установить 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
}
...