2017-10-19 31 views
1

我被告知,這將無法正確地將節點添加到列表中,但我已經測試它,它似乎工作。任何人都可以讓我知道這段代碼中的錯誤嗎?將元素添加到c中的列表開頭的代碼 - 錯誤是什麼?

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

void add_first(struct node* head, struct node* new_node) { 
    new_node->next = head; 
    head = new_node; 
} 

我試圖回答的具體問題是:

一)此功能將無法得到期望的結果(即,添加節點)。什麼是問題,什麼時候發生?

爲了嘗試找到問題,我創建了四個節點,在它們上使用add_first函數,然後顯示結果。不過,我似乎得到了正確的輸出結果。這是我整個編寫的程序,不包括上述功能:

void display(struct node* head) { 
    printf("%d ", head->num); 
    if(head->next == NULL) { 
     return; 
    } 
    display(head->next); 
} 

int main() { 
    struct node* n1; 
    struct node* n2; 
    struct node* n3; 

    n1 = (struct node*)malloc(sizeof(struct node*)); 
    n2 = (struct node*)malloc(sizeof(struct node*)); 
    n3 = (struct node*)malloc(sizeof(struct node*)); 

    n1->num = 1; 
    n2->num = 2; 
    n3->num = 3; 

    add_first(n1, n2); 
    add_first(n2, n3); 

    display(n3); 

    return 0; 
} 

我得到的輸出是:

這似乎是正確的。所以,如果我得到正確的輸出,爲什麼函數不能給出預期的結果?我沒有看到它的問題。

+0

majar問題是,你不能更新調用者的節點。嘗試更改API以使其更像'n1 = add_first(n1,n2);'(返回頭部)並且其他問題是'sizeof(struct node *)' - >'sizeof(struct node)'並且'next'沒有被初始化。 E.g'n1-> num = 1;' - >'n1-> num = 1; n1-> next = NULL;' – BLUEPIXY

回答

5

功能和測試程序是不正確的。

節點n1應該是不是頭呢?但是,您顯示的是通過節點n3而不是節點n1而不是節點的列表。

實際上,您建立了一個列表,其頭部爲n3,並將n2和n1添加到列表的尾部。

與功能

void add_first(struct node* head, struct node* new_node) { 
    new_node->next = head; 
    head = new_node; 
} 

的問題是,指針到節點head通過值傳遞。所以這個聲明

head = new_node; 

處理一個原始頭n1的副本。實際上該功能不會改變n1

您必須通過參考n1的頭部。

正確的代碼可以看至少像

void add_first(struct node **head, struct node *new_node) 
{ 
    new_node->next = *head; 
    *head = new_node; 
} 

考慮到,你必須設置數據成員添加的節點旁NULL帳戶。這是主要的,你必須爲每個創建的節點

n1->num = 1; 
n1->next = NULL; 
n2->num = 2; 
n2->next = NULL; 
n3->num = 3; 
n3->next = NULL; 

函數本身寫將被稱爲像

add_first(&n1, n2); 

add_first(&n1, n3); 

在這種情況下,功能顯示可稱爲正確傳遞給它的實際頭

display(n1); 

考慮到,像這樣

n1 = (struct node*)malloc(sizeof(struct node*)); 
             ^^^^^ 

聲明是無效的。而不是指針,你必須分配的節點本身是

n1 = (struct node*)malloc(sizeof(struct node)); 
             ^^^^ 
+0

非常感謝!我錯過了該函數正在處理複製而不是原始值的事實。你的解釋非常有幫助。 – Kendra

+0

@Kendra根本沒有。不用謝。:) –

0

add_first(node,NULL)將擦除頭指針數據並給出錯誤。

和第二情況下,如果頭是NULL add_first(NULL,node);

相關問題