對於單鏈表複製錯誤的反思

2021-09-21 10:34:23 字數 1601 閱讀 2763

原來錯誤的**:

view plaincopy to clipboardprint? 

sllnode *sllcopy( sllnode *const ptarget )    //拷貝單鏈表,若拷貝失敗或引數為空鍊錶,返回null,否則返回新鍊錶的首指標;函式並不破壞原鍊錶        

return pcopy;        

}    

由於才起步,經驗不足,導致以上錯誤。

用vs2008逐條跟蹤前期,並未發現此函式有錯。但發現其它函式在修改sllcopy函式返回的「複製」的單鏈表後,原模板鍊錶也被修改,於是想到可能是指標無意間被修改,故將引數改為const並再次除錯,問題依舊。

但排除了首指標被修改問題之後,依次隔離其餘各函式,發現只要呼叫了sllcopy函式便會出現此問題,因此將除錯重點放在了此函式。

逐條跟蹤區域性變數,發現除模板鍊錶首指標ptarget 和 目標鍊錶首指標pcopy 不一樣之外,其餘指標都相同,便發現了問題所在。我只是簡單的將原鍊錶的各節點的pnext指標複製了一遍到pcopy所指向的目標鍊錶,因此,函式呼叫後,相當於建立了乙個新首指標pcopy去指向模板鍊錶,那麼通過對「複製」後的鍊錶進行操作也就修改了原模板鍊錶,導致後期錯誤的產生。

現將函式修改如下:

view plaincopy to clipboardprint? 

sllnode *sllcopy( sllnode *const ptarget )    //拷貝單鏈表,若拷貝失敗或引數為空鍊錶,返回null,否則返回新鍊錶的首指標;函式並不破壞原鍊錶        

//delete the useless rear node        

ptmpcopy = pcopy;        

while( null != ptmpcopy->pnext->pnext )        

ptmpcopy = ptmpcopy->pnext;        

ptmpcopy->pnext = null;        

delete ptmpcopy->pnext;        

return pcopy;        

}    

最後刪除了乙個無用尾節點,但是始終覺得這幾行**應該可以不用,需要對鍊錶複製進行怎樣的改動呢?希望能得聽聽大家的意見。

由於才起步,**一般很幼稚,望高手包含,更希望熱心人多多指點,非常感謝。

【注】下附沒有無用尾節點的sllcopy版本

sllnode *sllcopy( sllnode *const ptarget )  //拷貝單鏈表,若拷貝失敗或引數為空鍊錶,返回null,否則返回新鍊錶的首指標;函式並不破壞原鍊錶 

//delete the useless rear node 

//ptmpcopy = pcopy; 

//while( null != ptmpcopy->pnext->pnext ) 

//  ptmpcopy = ptmpcopy->pnext; 

// 

//ptmpcopy->pnext = null; 

//delete ptmpcopy->pnext; 

return pcopy->pnext; 

}

對於單鏈表複製錯誤的反思

原來錯誤的 view plaincopy to clipboardprint?sllnode sllcopy sllnode const ptarget 拷貝單鏈表,若拷貝失敗或引數為空鍊錶,返回null,否則返回新鍊錶的首指標 函式並不破壞原鍊錶 return pcopy 由於才起步,經驗不足,導...

複雜單鏈表的複製

wz asust 2016 1 先int例項 後模板化 2 複製不能改變原串的資料及結構 3 隨機指標的正確性 思考 除了追加新結點後分離新舊鍊錶 還有一複雜度高的演算法,就是記錄下每乙個結點,隨機指標指向的結點在整個鏈中的排序 佇列實現 建立新煉表後,根據佇列記錄,連線隨機指標 不能記錄值,僅能實...

複雜單鏈表的複製

複雜單鏈表的複製 一 何為複製單鏈表 就我們所知,單鏈表也就是乙個結點包含乙個資料域和乙個指標域,這樣若干個結點構成的鍊錶。而複雜單鏈表和普通單鏈表差不多,唯一的不同就是多乙個random。我們可以用一張圖來表示 那我們怎麼來進行複雜鍊錶的複製呢,現在公認的最有效的方法只有一種,就是在原有單鏈表的每...