2012-10-25 75 views
0

所以我想複製整個鏈表類,我有麻煩搞清楚它是如何做到這一點,複製構造一個鏈表類

class list{ 
    public: 
    list(const list &t); 
private: 
    struct Node{ 
    int x; 
    Node *next; 
    }*p; 

我開始是這樣的:

list::list(const list &t){ 
    Node* q; 
    q=new Node; 
    while (p!=NULL){ 
    q->x= p->x;} 
} 

但我不確定我是否在正確的軌道上或什麼。我也遇到了麻煩,我應該如何測試這樣的複製構造函數?例如,我有列表l1,然後我將幾個整數插入列表中,然後如何複製它?

+0

我會親自使複製構造函數私人和undefined,以便複製是不可能的。由於過度複製應該通過引用傳遞的參數,我確實已經看到應該在幾秒鐘內執行的C++程序花費10分鐘。必要時提供'const'參考。 – EJP

回答

2

在你的例子中,如果你初始化了p,它將永遠不會工作,或者如果p != NULL會永久工作。同時通過t list遍歷您必須分配新的節點:

p = NULL; 
    Node* copy = l.p; 
    Node* insert = p; 
    Node* inserted_el = NULL; 
    while (copy){ 
    insert = new Node(); 
    insert->x = copy->x; 
    insert->next = NULL; 
    if (inserted_el) { 
     inserted_el->next = insert; //copy memory pointer to next element 
    } else { 
     p = insert; //copy memory pointer to list head 
    } 
    copy = copy->next; 
    inserted_el = insert; 
    } 

這是基本的想法。另外不要忘記實現賦值運算符和析構函數。 用法:

list t1; 
//insert nodes 
list t2(t1); 
+0

以及您將如何調用該函數進行復制?因爲我試圖做的是,我有一個列表中插入幾個節點列表l1,然後列表副本= l1,但它不起作用 –

+0

更新我的回答 –

+0

析構函數現在評論,並且當我註釋掉打印聲明,它的作品... –

1

在你的代碼的最大麻煩就是你,而你需要做的,所以不要重複列表中的每個節點。

下面是構造函數的代碼:

list::list(const list &t) 
{ 
    p = NULL;   // Init the head of the list this is vital important. 

    // Loop over the elements of the passed list if any. 
    Node *pt = t.p; 
    Node *last_local_element = NULL; 
    while (pt != NULL) 
    { 
    // Allocate a new node and set the fields there. 
    Node *q = new Node; 
    q->x= pt->x; 
     q->next = NULL; 

    // Add new node to the local list. 
    if (last_local_element != NULL) { 
     last_local_element->next = q; 
    } else { 
     p = q; 
    } 

    last_local_element = q; 

    // Shift the loop variable along the passed list. 
    pt = pt->next; 
    } 
} 

有2個最常見的情況,當拷貝構造函數被調用:

list my_list1; 

list my_list2(my_listl);   // Explicit call. 
list my_list3 = my_listl;   // Assignment in the definition statement. 
1

隨着你的類的設計,你要小心與內存管理。這是代碼:

list::list(const list& t) { 
    Node* n = t.p; 
    Node* m = p; 
    while (n) { 
    if (!m) { 
     m = new Node(); // Allocate memory. 
     if (!p) p = m; 
    } 
    m->x = n->x; 
    m = m->next; 
    n = n->next; 
    } 

    if (m) { // Original list is longer, delete the rest of the list. 
    Node * tmp = m; 
    m = m->next; 
    delete tmp; 
    } 
}