2014-10-22 62 views
0

使用鏈接列表時,我遇到了很多麻煩實現深層複製的問題。我很確定問題是使用otherList.listData->給我一個指向原始列表中的數據的指針,而不是複製這些值。但是,我對如何直接訪問數據感到困惑。我以爲你可以放棄這些指針,但我必須有錯誤的語法。對於CourseList類所需的數據,也沒有get/set方法。使用鏈接列表複製Ctor

有沒有人有任何想法?

頭文件

class CourseList 
{ 
    private: 
    struct CourseNode 
    { 
     int CRN; 
     char letterGrade; 
     CourseNode *next; 
    }; 
    int length; 
    CourseNode *listData; 
public: 
    CourseList(); 
    CourseList(const CourseList& otherList); 
    ~CourseList(); 




}; 

CPP文件

CourseList::CourseList(const CourseList& otherList) 
{ 
length = otherList.length; 

for (int i = 0; i < length; i++) 
{ 
    CourseNode* temp = new CourseNode; 
    temp->CRN = otherList.listData->CRN; 
    temp->letterGrade = otherList.listData->letterGrade; 
    temp->next = otherList.listData->next; 
    listData = temp; 
} 

} 
+0

敢肯定你正在試圖做的[這樣的事情(http://ideone.com/ JcFPfR)。 – WhozCraig 2014-10-22 11:49:44

回答

1

你的拷貝構造函數被打破:它結束了最後一個元素分配給listData的第一要素來代替。這意味着你泄漏了除列表的最後一個元素外的所有元素。此外,每次創建new CourseNode時,都會將其指定的next指針指向完全​​相同的內容 - 對於所有複製的元素!

+0

雖然暫時忽略這一部分,但我可以在之後解決這個問題。關於我原來的問題的任何想法? – Bagelstein 2014-10-22 08:30:33

+0

我不明白,我告訴你,你的代碼被嚴重破壞的具體地方,你想「忽略」,並專注於......什麼? – 2014-10-22 09:37:25

+0

我認爲我的問題是如何分配值,而不是擔心其餘的問題,但看起來我的任務很好,而且我的錯誤確實與更新指針有關。其他人試圖幫助解決這個問題,但是我現在用他們的例子工作了一個多小時,並且完全沒有運氣。你有什麼機會提供更多的指導? – Bagelstein 2014-10-22 09:55:25

0

您不能複製next成員的值,因爲該成員會指向原始列表。

相反,你必須設置你的迭代,即是這樣的:

CourseNode *node = 0; 
CourseNode *src = otherList.listData; 
for (int i = 0; i < length; ++i) 
{ 
    CourseNode *next = new CourseNode(); 
    if (node) 
     node->next = next; // already a previous node; update it 
    else 
     listData = next; // no previous node; set the very first one 

    next->previous = node; // optional in case your list is a double linked list 

    // now populate "node" with the original values (i.e. the actual copy operation) 
    node->CRN = src->CRN; 
    node->letterGrade = src->letterGrade; 

    // switch to the next source node 
    src = src->next; 
} 
+0

原始值的人口是我遇到的困難。是的,我在節點間移動的過程中出現了一個錯誤,由於我遇到了麻煩,我還沒有到達那個部分。有任何想法嗎? – Bagelstein 2014-10-22 08:34:30

+0

@ user3889565我已經用該部分更新了我的代碼片段。請儘量瞭解發生了什麼,然後再複製並使用它。 :) – Mario 2014-10-22 08:37:58

+0

根據這個我正確使用otherList.listData-> CRN等。不幸的是,即使我做出調整,以便節點更新正確,仍然會得到相同的訪問衝突錯誤。我將不得不繼續調整它。 – Bagelstein 2014-10-22 08:48:14