2015-10-10 1 views
1

У меня была проблема со связанным списком. Таким образом, в основном пользователь будет просто вводить значения, и эти значения будут добавлены в связанный список, пока пользователь не введет -1. Вот мой код:C список списка программирования, показывающий последний отрицательный элемент

#include "stdafx.h" 
#include <stdlib.h> 
#include <stdio.h> 

typedef struct node 
{ 
    int num; 
    struct node *next; 
}ListNode; 

int main() { 
    int n = 0; 
    ListNode *newNode = NULL, *head = NULL; 
    newNode = malloc(sizeof(ListNode)); 
    head = newNode; 

    printf("Enter a list of numbers, terminated by the value -1: "); 
    do { 
     scanf("%d", &n); 
     if (n == -1) { 
      newNode->next = NULL; 
      break; 
     } 
     else { 
      newNode->num = n; 
      newNode->next = malloc(sizeof(ListNode)); 
      newNode = newNode->next; 
     } 
    } while (n != -1); 

    newNode = head; 
    while (newNode != NULL) 
    { 
     printf("%d ", newNode->num); 
     newNode = newNode->next; 
    } 

    return 0; 
} 

Так скажем, я вошел 1 2 3 4 -1. Ожидаемый результат должен быть 1 2 3 4. Тем не менее, я получаю 1 2 3 4 -842150451. Интересно, почему существует номер -ve. Проблема заключается в моей части списка printNode?

Заранее спасибо.

+0

Вы установили * следующий * узел в NULL, если вы столкнулись с -1. Его текущее значение 'num' не изменяется. Вы должны перемещать создание нового узла * до * хранения ваших номеров, а не после. – usr2564301

ответ

2

Вы всегда выделяют еще один узел, чем чисел, введенных пользователем. То, что последний узел num неинициализирован (вот откуда берется ваше значение для мусора).

Вот можно исправить:

ListNode **pnode, *head = NULL; 
pnode = &head; 

printf("Enter a list of numbers, terminated by the value -1: "); 
while (scanf("%d", &n) == 1 && n != -1) { 
    *pnode = malloc(sizeof **pnode); 
    (*pnode)->num = n; 
    (*pnode)->next = NULL; 
    pnode = &(*pnode)->next; 
} 

условие цикла гарантирует, что мы были в состоянии прочитать номер, и что число не является -1.

После этого мы выделяем новый узел (т. Е. Выделяем только столько узлов, сколько введенных чисел).

pnode указывает на последний указатель в цепочке узлов. Он отмечает место, где должен быть вставлен следующий узел. Первоначально это &head (т. Е. Первый узел хранится в head (через назначение *pnode)), но он перемещается по списку с каждой вставкой (pnode = &(*pnode)->next, новый последний указатель).

+0

Большое спасибо! Он работает и благодарит за объяснение. Похоже, мне нужно больше времени, чтобы освежить мои знания связанного списка! –

0

Следующий узел, выделенный в цикле do/while, не инициализирован. Следовательно, последний узел имеет неопределенное поле num.

Не используйте петлю do/while. Проверьте возвращаемое значение scanf, выделите узел по необходимости, а не заранее.

Вот исправленная и упрощенная версия:

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

typedef struct node { 
    int num; 
    struct node *next; 
} ListNode; 

int main(void) { 
    int n; 
    ListNode *head = NULL, **tailp = &head; 

    printf("Enter a list of numbers, terminated by the value -1: "); 
    while (scanf("%d", &n) == 1 && n != -1) { 
     ListNode *newNode = malloc(sizeof(ListNode)); 
     newNode->num = n; 
     newNode->next = NULL; 
     *tailp = newNode; 
     tailp = &newNode->next; 
    } 

    for (ListNode *np = head; np != NULL; np = np->next) { 
     printf("%d ", np->num); 
    } 
    printf("\n"); 

    return 0; 
} 
+0

У вас есть две переменные, называемые 'n'. – melpomene

1

Вы можете изменить свой цикл печати на:

while (newNode->next != NULL) 
    { 
     printf("%d ", newNode->num); 
     newNode = newNode->next; 
    } 

Хотя это только не печатает последний резервный узел, который вы создаете. Лучше будет, если вы измените свой код, чтобы на первом месте у вас не было избыточного узла!

Когда вы добавляете значение к узлу внутри вашего блока else, выполнив newNode->num = n, вскоре после создания нового узла выполните newNode->next=malloc(sizeof(ListNode)). Подумайте, что, если это последнее значение в вашем списке, которое вы только что вставили. Действительно ли нужно создать новый узел после этого?

+0

Спасибо большое! Он тоже работает! –

0

У вас всегда есть еще один узел в списке, чем у вас есть значения. Значение последнего узла num не назначено. Что произойдет, если первое значение равно -1? У вас должен быть узел в head. Удалите первый malloc и внутри цикла назначьте newNode->num после mallocing. Вам придется назначить head там, проверяя, все ли он равен нулю.

0

Использование цикла «while» во время печати на основе состояния newNode-> next!= NULL должен решить вашу проблему.