2016-12-23 97 views
0

我剛剛完成了單列表副本構造函數的工作,現在我正在製作一個雙列表副本構造函數。任何人都可以告訴我它與單列表構造函數有什麼不同,因爲我在重新啓動我的雙鏈表副本構造函數或複製我的單列表副本構造函數之間存在衝突。我應該怎麼做呢?雙列表複製構造函數:與單列表複製構造函數有什麼不同?

如果有幫助,這裏是從我的單鏈表我的拷貝構造函數:

 List(const List &copying) : head(NULL) 
     { 
      Node* cur = copying.head; 
      int size = copying.size(); 
      Node* end = NULL; 
      for(int q = 0; q < size; q++) 
      { 
       Node* n = new Node; 
       n->value = cur->value; 
       if (head == NULL) 
       { 
        head = n; 
        end = head; 
       } 
       else 
       { 
        end->next = n; 
        end = n; 
       } 
       cur = cur->next; 
      } 
      end->next = NULL; 
     } 

任何和所有的投入是值得歡迎的。謝謝大家:-)

+0

如果您從空列表複製,您的單鏈表副本構造函數將炸燬。鏈表首要規則:永遠不要有特殊情況。 (Node * cur = copying.head; cur; cur = cur-next){Node * n = new Node(cur-> value);節點**目標= &head; * target = n; target =&(n-> next); } * target = nullptr;' –

+0

「爆炸」意味着什麼意味着@MartinBonner?我實際上是新來的編程在c + +。 –

+0

@PeterG該鏈接不是複製構造函數。我檢查過它,但它沒有回答我關於複製鏈接列表的複製構造函數的查詢。 –

回答

1

我想你只需要存儲前一個節點(prv)。 假設您的節點具有prv作爲數據成員。

List(const List &copying) : head(NULL) 
{ 
    Node* cur = copying.head; 
    int size = copying.size(); 
    Node* end = NULL; 
    Node* prv = NULL: 
    for(int q = 0; q < size; q++) 
    { 
     Node* n = new Node; 
     n->value = cur->value; 
     if (head == NULL) 
     { 
      head = n; 
      end = head; 
     } 
     else 
     { 
      end->next = n; 
      end = n; 
     } 
     n->prv=prv; 
     prv=n; 
     cur = cur->next; 
    } 
    end->next = NULL; 
} 
+0

好吧,你已經複製了錯誤 - 嘗試複製一個零長度的列表! –

+0

對不起,我沒有分析代碼 – user1438832

+0

@MartinBonner是不是,如果if '(head == NULL){head = n; end = head;}​​'會完成嗎? –