2013-04-12 45 views
0

我正在嘗試爲雙鏈表中的節點編寫一個複製賦值運算符。但是,下面的代碼是給我一個堆棧溢出:雙鏈表節點運算符=

template <class DataType> 
ListNode<DataType>& ListNode<DataType>::operator=(const ListNode<DataType>& Node) 
{ 
if(this == &Node) 
    return *this; 
else 
{ 
    if(Child != NULL) 
     delete Child; 
    if(Parent != NULL) 
     delete Parent; 

    if(Node.Child != NULL) 
    { 
     Child = new ListNode<DataType>(); 
     *Child = *Node.Child; 
    } 
    else 
     Child = NULL; 

    if(Node.Parent != NULL) 
    { 
     Parent = new ListNode<DataType>(); 
     *Parent = *Node.Parent; 
    } 
    else 
     Parent = NULL; 

    _data = Node._data; 
} 
return *this; 
} 

什麼是複製這樣一個節點的標準方式,我需要以使用其他手段(即不是一個拷貝賦值運算符)以做到這一點?我希望儘可能避免這樣做,因爲它會涉及重寫大量的現有程序。這個函數對於一個單獨的鏈表似乎工作得很好,但是通過添加父指針的拷貝,它似乎遇到了問題。我似乎無法確定爲什麼,或者想出一種替代方法來編寫此功能。

+0

您可能想要創建一個'clear()'函數來刪除當前列表中的所有**節點。你的析構函數可以使用它,這個函數也是如此,當前你最多隻能刪除2個節點。 –

+0

聞起來像遞歸:'* Child = * Node.Child;'。 –

+0

是遞歸!你基本上是複製整個鏈表。不只是一個節點。 – 2013-04-12 20:08:52

回答

0
*Parent = *Node.Parent; 

將調用operator =爲Parent,開始遞歸。
BTW在

if(Child != NULL) 
    delete Child; 

如果是多餘的,因爲刪除NULL是一個有效的操作。

0

我建議你將名稱parent更改爲previouschildnext。只是爲了澄清他們的真正含義。 Parentchild似乎更適合樹。

if(Node.Child != NULL) 
{ 
    Child = new ListNode<DataType>(); 
    *Child = *Node.Child; 
} 

記住這將調用ListNode<DataType>::operator=在第二次分配。這將一次又一次地調用它,直到整個兒童鏈被複制。

父母也一樣。

if(Node.Parent != NULL) 
{ 
    Parent = new ListNode<DataType>(); 
    *Parent = *Node.Parent; 
} 

所以基本上你只是複製了整個列表。


如果您只是想將一個節點複製到另一個節點。您應該只複製節點中的value。不是實際的節點。重複實際的節點是沒有意義的,我認爲。

對於eeample如果鏈接包含int S和你想的5th成員複製到8th成員,那麼你只需要在節點中的int的值複製。

+0

嗯,我明白你的意思。但是,如果我只是複製節點中包含的值,那麼我並沒有完整地複製該節點,因爲該節點與正在複製的節點沒有相同的前一個或下一個指針。 – fanatic

+0

@ Henri'Henners'Keeble一個列表不應該有節點具有相同的下一個節點或前一個節點。一個列表必須是一個鏈。沒有分支或樹葉。這不是你想到的嗎?爲什麼你想讓兩個節點有相同的「父母」。那麼它將是一種樹狀結構。想想看。 – 2013-04-12 20:24:22

+0

在這種情況下,我的問題必須出現在我的列表中。鏈表的operator =必須有'* Head = * param-> Head'這是調用這個操作符的地方。除非我複製實際的下一個或上一個指針,否則稍後我會遇到問題。 – fanatic