2014-03-27 61 views
0

所以我試圖爲鏈表創建一個複製構造函數。我已經在拷貝構造函數中嘗試了一堆不同的方法,但它們都沒有工作。任何人都可以告訴我該怎麼做才能改進代碼?鏈接列表C++的複製構造函數

Stack::Stack(Stack*StkIn) 
{ 
top = NULL; 
numItems = 0; 
node* oPtr = StkIn->top; 
node* nPtr = top; 
while (oPtr != NULL) 
{ 
    nPtr->item = oPtr->item; 
    nPtr = nPtr->next; 
    oPtr = oPtr->next; 
} 
} 
+0

原因之一,實際上覆制的東西。你的第一次迭代是解引用NULL指針並調用*未定義的行爲*。而複製構造函數不通過地址(指針)傳遞它們的參數,它們通過* reference *。簡而言之,這個拷貝中沒有任何內容是正確的。 – WhozCraig

+0

你可以補充你的完整代碼嗎? – BlackMamba

回答

0

試試下面的代碼:

Stack::Stack(Stack*StkIn) 
{ 
top = NULL; 
numItems = 0; 
node* oPtr = StkIn->top; 
node* nPtr = new Stack(); 
node* npPtr = NULL; 
while (oPtr != NULL) 
{ 
npPtr = new Stack(); 
    nPtr->item = oPtr->item; 
    nPtr->next = npPtr; 
    nPtr = npPtr; 
    oPtr = oPtr->next; 
} 
} 
+0

這不是一個複製構造函數。見'託尼D'的回答 – smac89

+0

這有點隨意。 '節點* NPTR = =新的堆棧()'應該是'新節點()'(而不是做,如果'StkIn'的'top'是'nullptr'),'top'從來沒有更新,'numItems' ISN沒有維護.... –

0

如果你想這是一個拷貝構造函數,簽名應改變接受const參考:

Stack::Stack(const Stack& StkIn) 
{ 
    top = NULL; 
    numItems = 0; 

    node* oPtr = StkIn.top; 
    node* nPtr = top;  // this sets nPtr to NULL 
    while (oPtr != NULL) 
    { 
     nPtr->item = oPtr->item; // then you dereference nPtr - initially NULL!!!! 
     nPtr = nPtr->next; 
     oPtr = oPtr->next; 
    } 
} 

你需要做的一個new node;在循環內部分配內存,然後設置數據成員。而你並沒有更新top指向第一個新節點。

退一步,你應該學會如何解決這類問題。在紙面上寫下這樣的:

[oPtr = StkIn.top = NULL] 

[oPtr = StkIn.top] ----> [node:{item1,next=NULL] 

[oPtr = StkIn.top] ----> [node:{item1,next--]----> [node:{item2,next=NULL] 

那是三個測試用例......如果你能證明你自己,你的代碼適用於所有三種,那麼它可能會爲任意數量的列表中的節點的工作。

對於這些,遵循行代碼行,工作了變量將舉行什麼,看看說明書進行正確StkIn複製到新的內存。例如,最後一個應該產生這樣的:

[top] ----> [node:{item1,next--]----> [node:{item2,next=NULL] 

繼/在紙上鍛鍊你的邏輯是對這類問題非常有用....