2014-03-06 60 views
0

這是我的功能來複制一個列表。錯誤是它總是複製第一個元素兩次。我究竟做錯了什麼?如何在C中創建鏈接列表的副本?

Node *copy(Node *list) { 

    Node *newlist, *p; 

    p = malloc(sizeof(Node)); 
    newlist = p; 

    while (list != NULL) { 
     strcpy(p->airport, list->airport); 
     p = p->next; 
     p = malloc(sizeof(Node)); 
     list = list->next; 
    } 

    return newlist; 
} 
+2

這已經是關於今天覆制鏈表的第三個問題了。甚至符號名稱也是一樣的。本網站的名稱不是www.domyhomework.com! –

回答

0

這些線不可能是正確的:

p = p->next; 
p = malloc(sizeof(Node)); 

作爲其設定的p一個新值,然後將其覆蓋。

我建議你把malloc的新節點放在while的循環內。您還需要在分配後將p->next設置爲某個值,並保留指向分配的第一個新節點的指針。

+0

不,其實你錯了。 因爲他有p的第一個元素地址,保存在新列表中並在while外部分配,他可以使用p本身分配下一個元素。 它只是改變事物的順序: p-> next = malloc(sizeof(Node)); p = p-> next; – rfermi

+0

@rfermi好吧,從技術上講,答案並不錯。 OP的代碼是。正如所寫的,這條線條沒有意義。 –

+0

@rfermi http://www.creativecatalyst.co.uk/the-right-notes-in-the-wrong-order/? – abligh

0

如何:

Node *copy(Node *list) { 

    Node *newlist, *p, *prev; 

    newlist = p = NULL; 

    while (list != NULL) { 
     p = malloc(sizeof(*p)); 
     strcpy(p->airport, list->airport); 
     if (!newlist) 
      newlist = p; 
     else 
      prev->next = p; 
     prev = p; 
     list = list->next; 
    } 
    prev->next = NULL; 
    return newlist; 
} 

你需要一個參考保持以前的節點其next在下一次迭代更新。

1

只要改變這些行

p = p->next; 
    p = malloc(sizeof(Node)); 

的順序

p->next = malloc(sizeof(Node)); 
    p = p->next; 
+0

你是誤導人。他會爲頭節點分配兩次內存,這是不必要的。 – lekroif

+0

其實不是@lekroif,即時要求他改變指令的順序。 – rfermi

2

打破它分爲3個部分。

// Part 1 - the null list 
if (list == NULL) return NULL; 

// Part 2 - the head element 
Node *newHead = malloc(sizeof(Node)); 
strcpy(newHead->airport, list->airport); 

// Part 3 - the rest of the list 
Node *p = newHead; 
list = list->next; 
while(list != NULL) { 
    p->next = malloc(sizeof(Node); 
    p=p->next; 
    strcpy(p->airport, list->airport); 
    list = list->next; 
} 
p->next = NULL; // terminate last element. 
+0

其他答案與此相比相當混亂。 – lekroif