2014-11-16 44 views
1

在此代碼:爲什麼在複製鏈表時這個指針被賦值?

Node *CopyList(Node **head) { 
    Node *current = *head; 
    Node *NewNode = NULL; 
    Node *tail = NULL; 

    while (current != NULL) { 
     if (NewNode == NULL) { 
      NewNode = malloc(sizeof(Node)); 
      NewNode->data = current->data; 
      NewNode->next = NULL; // routine 
      tail = NewNode; 
     } else { 
      tail->next = malloc(sizeof(Node)); // here 
      tail = tail->next; 
      tail->data = current->data; 
      tail->next = NULL; 
     } 
     current = current->next; 
    } 
    return(NewNode); 
} 

爲什麼我們分配tail->nextmalloc()調用的結果?很顯然,如果我們不這樣做,會發生分段錯誤。

爲什麼我們不是隻分配tail而不是tail->next?有什麼情況下我應該這樣分配?

+0

這段代碼看起來很合理。在第一次迭代中,它分配新列表的頭部('NewNode'),並在每個後續迭代中擴展新列表的尾部。你認爲這是什麼錯誤?由於'tail',不應該有段錯誤,因爲它在使用時不會爲NULL。這裏唯一錯誤的是'malloc'的返回值沒有被檢查爲NULL。 – JS1

+0

我沒有想到這個錯誤,只是我沒有得到它的方式。 –

回答

2

這僅僅是一個方便,以避免額外的變量:

Node* temp = malloc(sizeof(Node)); // here 
temp->data = current->data ; 
temp->next = NULL ; 

tail->next = temp ; 
tail = tail->next; 

爲什麼我們不只是分配,而不是tail->下一頁尾?

尾已分配,它充當前一個節點,因此我們可以將其鏈接到下一個節點。我們使用tail-> next = that_node來爲該節點分配一個新節點和鏈接尾部。

+0

編輯後感謝你,這已經足夠了。 –

1

此處NewNode表示新的鏈接列表頭。所以在while循環中第一次被分配,所以下一次不會改變。回到你的問題,'tail-> next'而不是'tail',因爲第一次'NewNode == NULL'時'tail = NewNode'被執行意味着尾部有NewNode地址。所以下一步你需要將下一個塊複製到'tail-> next'中,因爲尾部已經有了'NewNode'。

+0

對不起,但有些東西我仍然不明白,我是否需要將下一個塊複製到'tail-> next'中,請問您能解釋更多特殊字符嗎? –

+1

如果'tail = NewNode'意味着NewNode被分配給tail,現在在其他部分中,您應該將下一個塊複製到尾部意味着您需要將新塊分配給'tail-> next',因爲尾部已經具有NewNode。一旦您嘗試通過鏈接列表擁有2個以上節點進行空運行。然後你很容易就可以了 – kriyeta

相關問題