2015-08-29 246 views
-4

下面的代碼給出錯誤,我不知道爲什麼。 下面的函數是將節點插入鏈表的末尾。在鏈表末尾插入節點

struct Node { 
    int data; 
    struct Node *next; 
}; 

Node* Insert(struct Node *head,int data) 
{ 
    struct Node *p; 
    p=head; 
    struct Node *prev; 
    struct Node *temp=(struct Node*)malloc(sizeof(struct Node)); 
    temp->data=data; 
    temp->next=NULL; 

    if(head==NULL){ 
     head=temp; 
     return head; 
     //return temp; 
    }           `` 
    while(p!=NULL){ 
     prev=p; 
     p=p->next; 
    } 
    p=temp;//If we change this line to prev->next=temp .It is giving the correct result 
    return head; 
} 

在上面的代碼 如果我們更換線(p=temp;)prev->next=temp它的工作原理。 請幫我理解這背後的邏輯。 在此先感謝。 問題來自hackrank

+2

試想想:將與分配後'p'發生什麼呢? – qrdl

+1

如果兩個指針指向相同的內存位置,更改一個不會改變另一個。兩個指針都完全分開。如果你想改變另一個指針,你也可以使用指向指針的指針。但那會讓它變得更加複雜。 – wimh

+0

[不要強制轉換'malloc'的返回值](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – MC93

回答

0

您將新創建的節點分配給p.那部分是正確的。然而,前面的節點並不知道這個新創建的最後一個元素的地址,因爲prev->next被分配給NULL。所以你必須將前一個下一個指針指定給temp,以便將節點temp鏈接到List。在while循環結束之前p有一些值,但下一個指針指定爲NULL。所以下一次prev有一些數據,下一個指針是NULL。你不改變這個下一個指針指向下一個是temp的節點。只將temp分配給p。因此最後一個temp沒有鏈接到列表。

循環試後:

p=temp; 
prev->next=p; 

或者只是

prev->next=temp; 
+0

你是什麼意思?我們不能在達到NULL指針後分配節點嗎? – Vikas

+0

是的,你可以,你沒有這樣做。結果第二個元素的下一個指針分配給NULL,而不是臨時節點。 –

+0

我正在將p處的值從NULL更改爲temp-> next = NULL的temp的地址。我按照我的代碼正確嗎? – Vikas