2012-07-13 84 views
1

我需要用下面的代碼幫助有關鏈接列表:鍛鍊; Tibial約C列出

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

struct nodo { 
    int d; 
    struct nodo *next; 
}; 

struct nodo *full(); 

int main() 
{ 
    struct nodo *l; 
    /* l=(struct nodo *)malloc(sizeof(struct nodo)); */ 
    l = full(); 
    while(l!=NULL) { 
     printf("-->%d\n", l->d); 
     l =l->next; 
    } 
    system("PAUSE"); 
} 
struct nodo *full() 
{ 
    int i; 
    struct nodo *head, *nes; 
    head = (struct nodo *)malloc(sizeof(struct nodo)); 
    head->next = NULL; 
    for(i = 1; i < 5; i++) { 
     nes = (struct nodo *)malloc(sizeof(struct nodo)); 
     printf("Insert the %d element:\n", i); 
     scanf("%d", &nes->d); 
     nes->next = head; 
     head = nes; 
    } 
    return head; 
} 

如果我嘗試例如輸入1, 2, 3, 4,我得到下面的輸出:

-->4 
-->3 
-->2 
-->1 
-->9708864 

爲什麼我得到最後一個號碼?我的代碼有什麼問題?

+3

這功課嗎?另外:1.不需要輸入'malloc'的結果,2.在調用'full()'之前不需要'malloc',3.你沒有調用'free()'... – 2012-07-13 12:04:23

+0

@EitanT當然是;如果不是的話,OP就不敢投入malloc()的返回值。 – 2012-07-13 12:06:24

+0

@EitanT我總是投下malloc的結果,因爲是的,這是一個家庭作業,如果我不投,我的編譯器返回這個錯誤:無效轉換從'void *'到'nodo *'我應該在哪裏打電話免費? – gyosko 2012-07-13 12:10:14

回答

3

正如@Vinska在評論中指出的那樣,full()的第3行是不必要的;它正在創建一個額外的節點。

有問題的行是

head = (struct nodo *)malloc(sizeof(struct nodo));

而是說:

head = NULL

與您現有的代碼,你的鏈表有5個元素。第一個是在上述線路上創建的。如預期的那樣,剩餘的四個項目在循環中創建,共5個元素。

9708864號碼是垃圾值。當你撥打malloc()時,無論發生什麼事情都在記憶中。這就是爲什麼你必須初始化所有的變量!或者,在這種情況下,請使用memset()calloc()將這些塊設置爲某個理智的值。 (但是,無論如何,這條線是完全多餘的。)

祝你好運!

+0

現在完美工作,謝謝! – gyosko 2012-07-13 16:02:03

0

在你的代碼中,我沒有看到你保存了鏈表的開始。我這樣做:

struct nodo *full() 
{ 
    int i; 
    struct nodo *head, *nes; 
    head = (struct nodo *)malloc(sizeof(struct nodo)); 
    nes = head; 

    for(i = 1; i < 5; i++) { 
     nes->next = (struct nodo *)malloc(sizeof(struct nodo)); 
     printf("Insert the %d element:", i); 
     scanf("%d", &nes->d); 
     printf("%s","\n"); 
     nes = nes->next; 
    } 
    return head; 
} 

這種方式建立列表的頭,但後來使用您的「運行」或「當前」列表指針 - 內斯 - 作爲列表製作。

在創建列表時,head仍然指向列表的頭部。

我做了另一次修改,以便在輸入數字後發生行結束符。