2014-03-18 3 views
-1

Вот мой код, я пытаюсь попросить пользователя указать некоторые цифры, а затем распечатать их. Я использовал использование связанных списков для своей цели. Программа работает, но заканчивается внезапно, я понятия не имею, что добавить или удалить из кода.Печать одиночно связанного списка завершает программу внезапно

#include <stdio.h> 
#include <stdlib.h> 
typedef struct node 
{ 
    int item; 
    struct node *next; 
}ListNode; 
void printList(ListNode *head); 
int main() 
{ 
    int n; 
    ListNode *head = NULL; 
    ListNode *temp = NULL; 
    printf("Enter a value: "); 
    scanf("%d", &n); 
    while (n != -1) 
    { 
     if (head == NULL) 
     { 
      head = malloc(sizeof(ListNode)); 
      temp = head; 
     } 
     else 
     { 
      temp->next = malloc(sizeof(ListNode)); 
      temp = temp->next; 
     } 
     temp->item = n; 
     printf("Enter a value: "); 
     scanf("%d", &n); 
    } 
    while (head != NULL) 
    { 
     printf("%i\n", head->item); 
     head = head->next; 
    } 
    free(head); 
    return 0; 
} 

Когда я ввести 3 numbes (например, 1, 2 и 3), он выводит 123 затем завершает программу abuptly. Может кто-то пролить свет на это?

+0

Итак, ваш вход 1 2 3 и -1? – Dinesh

+0

Да, правильно, я забыл указать, что мне нужно ввести -1, чтобы закончить ввод – mib1413456

ответ

2

Вы не установили следующее поле последнего элемента в NULL:

temp->item = n; 
temp->next = NULL; // add this line 

И при печати, while (head != NULL) никогда не будет держать, как есть мусор в head-> рядом. Итак, вы пытаетесь получить доступ к произвольному указателю, который приводит к сбою.

+0

Большое спасибо, это сработало. Простое объяснение! – mib1413456

-1

Он заканчивается, потому что после того, как он закончит печать у вас есть return 0;, которые традиционно заканчивает программу, когда она встречается в main()

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

Я просто посмотрел снова. Еще одна из ваших проблем заключается в том, что вы никогда не инициализируете head-> next, так что это просто случайный мусор, который вы получаете из переполнения буфера.

+0

Нет проблем, что он вылетает из программы после печати 123. Надеюсь, что это очистит. – mib1413456

+0

Что заставляет вас думать, что это сбой? – ciphermagi

+1

Потому что я использую CTRL + F5 на визуальной студии, чтобы остановить программу, потому что она попросит меня нажать любую кнопку, чтобы закончить программу. Он не дошел до той части, где он просит меня нажать любую кнопку. – mib1413456

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