2010-12-09 3 views
1

Проблема в цикле while. Я не мог найти, что случилось.Бесконечный цикл при перечислении связанного списка

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

typedef struct node { 
     int data; 
     node *next; 
     }; 

int main(){ 
node * root= (node *) malloc(sizeof(node)); 
node * temp = root; 
for(int i=0;i<10;i++){ 
     temp->data=i*10; 
     temp->next=(node *) malloc(sizeof(node)); 
     temp=temp->next; 
     }  
temp =root; 
while(temp){ //infinite loop 
     printf("\n%d",temp->data); 
     temp=temp->next;  
     } 
     getch(); 
    return 0; 
}  
+2

Бесконечная петля или она висит? (Я бы догадался, что последний) - ваш окончательный temp-> следующий не определен и, скорее всего, отправит вашу программу в зону сумерек. – 2010-12-09 00:51:58

+4

Я единственный, кто ** любит ** идею «бесконечной петли»? – 2010-12-09 00:53:06

ответ

5

Вы никогда не заходило последние узлы рядом с нулем. Положить
temp->next = NULL;
после цикла for.

При назначении узла с помощью malloc значения не инициализируются ничем. Итак, next указывает на случайное место в памяти.

2

Вы, вероятно, не хватает этой последней строки в списке здания цикла:

/* ... */ 
    temp->next = NULL; 
} 
1

Когда вы назначаете последний узел, вы никогда не устанавливаете его указатель next. Поскольку он не инициализирован, он будет содержать данные, которые уже были в этом месте памяти, что почти наверняка не является NULL. После обработки всех узлов в цикле while ваша программа будет разыменовывать этот неинициализированный указатель и вызывать неопределенное поведение.

0

Вы уверены, что компилируете C?

В цикле for инициализируйте указатель next NULL.

for (int i = 0; i < 10; i++) { 
    /* ... */ 
    temp->next = malloc(sizeof (node)); 
    assert(temp->next && "no memory"); /* easy test of malloc return value */ 
    temp->next->next = NULL; 
    /* ... */ 
} 
0

Это потому, что while (temp) всегда содержит значение. Убедитесь, что ваш последний узел указывает значение NULL, так что temp=temp->next; вернет NULL и завершит цикл.

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