Бесконечный цикл при перечислении связанного списка - PullRequest
1 голос
/ 09 декабря 2010

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

#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;
}    

Ответы [ 5 ]

5 голосов
/ 09 декабря 2010

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

Когда вы выделяете узел с помощью malloc, значения ни к чему не инициализируются.Так что next указывает на какое-то случайное место в памяти.

2 голосов
/ 09 декабря 2010

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

    /* ... */
    temp->next = NULL;
}
1 голос
/ 09 декабря 2010

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

0 голосов
/ 09 декабря 2010

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

0 голосов
/ 09 декабря 2010

Вы уверены, что компилируете 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;
    /* ... */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...