2015-10-10 30 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數字。問題在於我的print listNode部分?

在此先感謝。

+0

如果遇到-1,則將* next *節點設置爲NULL。它的'當前'數字值不變。你應該在存儲你的號碼之前移動創建一個新的節點*,而不是之後。 – 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; 
    } 

雖然這只是不打印你所創建的最後一個冗餘節點。如果你修改你的代碼,那麼最好不要使用冗餘節點!

無論何時通過執行newNode->num = n將值添加到else塊內的節點上,您在創建新節點後立即執行newNode->next=malloc(sizeof(ListNode))。想一想,如果這是你剛剛插入的列表中的最後一個值。之後真的需要創建一個新節點嗎?

+0

非常感謝!它也可以工作! –

0

在列表中總是有多個節點,而不是有值。最後一個節點的num值未分配。如果第一個值是-1,會發生什麼?您應該仍然有一個節點head。移除第一個malloc,然後在循環內部,在mallocing之後分配newNode->num。您必須通過檢查它是否爲空來指定head

0

根據是否newNode-> next進行打印時'while'循環的使用!= NULL應該可以解決你的問題。

相關問題