2012-08-03 51 views
1

我目前的工作的這一部分有我徹底難倒了:製作拷貝構造函數W /鏈表

我想建立一個LinkedList類包括拷貝構造函數,它本身調用靜態方法(* makeCopy() )。我無法弄清楚如何使makeCopy方法工作(所有的方法頭文件都在賦值中給了我們)。

class ListNode 
{ 
public: 
    ListNode(double v, ListNode *p) 
{ 
    value = v; 
    next = p; 
} 
private:  
    double value; 
    ListNode *next; 
    friend class LinkedList; // LinkedList has friend status 
}; 

// The linked list class itself 
class LinkedList 
{ 
public: 
//Add number to Linked List 
void add(double x) 
{ 
    if (head == NULL) 
    { 
     head = new ListNode(x, NULL); 
     return; 
    } 
    else 
    { 
     ListNode *nodePtr = head; 
     head = new ListNode(x, nodePtr); 
    } 

} 
LinkedList() { head = NULL; } 

//Default destructor 
~LinkedList() 
{ 
    ListNode *nodePtr = head; 
    while (nodePtr != NULL) 
    { 
     ListNode *garbage = nodePtr; 
     nodePtr = nodePtr->next; 
     delete garbage; 
    } 
} 

//Copy Constructor 
LinkedList(LinkedList &); 

//Copy function 
static ListNode *makeCopy(ListNode *pList); 

private: 
    ListNode * head;  

}; 

下面是我想寫的makeCopy功能:「成員ListNode ::值爲innaccesible」

LinkedList::LinkedList(LinkedList &list) 
{ 
    *makeCopy(list.head); 
} 

static ListNode *makeCopy(ListNode *pList) 
{ 
    if(pList->value == NULL) 
    {   
     return NULL; 
    } 
    else 
    { 
    ListNode *node = pList; 

    while(node != NULL) 
    { 
     ListNode newOne = *node; 
     node = node->next; 
    } 
} 

return; 
} 

首先我繼續得到錯誤其次,我對C++非常陌生,並且很確定我沒有辦法。如果有人能幫助我在正確的方向推動,將不勝感激。 Thx

這是我目前的複製構造函數和makeCopy方法的迭代。不幸的是,ListNode的構造函數以及所有的方法頭文件是分配的一部分。我們必須爲他們編寫代碼。我現在得到的錯誤是這樣的:兩個返回語句都會聲明「錯誤:構造函數或析構函數可能不會返回值」。我完全失去了這個,因爲這只是一個返回語句,我沒有看到構造函數或析構函數。

LinkedList::LinkedList(LinkedList &list) 
{ 
    LinkedList *copy = new LinkedList(); 

    while(list.head != NULL) 
    { 
     ListNode node = *makeCopy(list.head); 
     copy->add(node.value); 
     list.head = head->next; 
    } 

    return *copy; 
} 

ListNode * LinkedList::makeCopy(ListNode *pList) 
{ 
    ListNode node = *pList; 

    return *node; 
} 
+1

您已經定義makeCopy爲非成員函數,而不是一個成員函數(方法)。這就是爲什麼它無法訪問私人會員。 – 2012-08-03 04:35:29

回答

1
static ListNode *makeCopy(ListNode *pList) 

應該

ListNode * LinkedList::makeCopy(ListNode *pList) 

你的版本定義了內部linkeage免費的功能,而不是定義的成員。

+0

@Martin true,但如果它是一個免費函數,則不能訪問私有成員,甚至會渲染代碼'newNode-> value = node-> value;'invalid。但我同意有更多的isses,爲你+1。 – 2012-08-03 04:43:20

+0

對不起 - 我刪除了我的評論。我完全錯過了整個問題 - makeCopy無法看到LinkedNode的字段:)。 – Martin 2012-08-03 04:45:40

1

<編輯1 >首先,您需要了解您的makeCopy右聯動 - 見Luchian的答案中的解釋。 < /編輯1 >

你的第一個問題是,在makeCopy的開始,你要比較value(雙),以NULL(零,對於所有意圖和目的),並返回一個空指針他們匹配。

我懷疑你實際上是在說,如果pList本身是NULL,則返回NULL。其次,你實際上從來沒有在makeCopy中製作任何東西的副本。在while循環內部,你正在堆棧上創建一個新節點,但是這隻會在循環的每次迭代中創建/銷燬。

您需要創建每個節點的副本,使用類似

ListNode * newNode = new Node(); 
newNode->value = node->value; 
newNode->next = ???; 

注意運用新創建一個新的元素。

你需要制定的事情(我懷疑家庭作業的真正目標,所以我不會在這裏餵食你),你是如何設置->next字段的。

如果您知道列表很小,您可能會考慮遞歸。儘管如此,這並不是非常可擴展的。

否則,您需要找到一種方法來設置下一個指針您複製下一個元素(這是更好的方式)。

<編輯2 > makeCopy也不會返回任何東西。它需要返回一個指向頭節點副本的指針(你需要記住)。

你的LinkedList拷貝構造函數實際上也沒有做任何事情。它調用makeCopy,取消引用返回的指針,然後拋出一切。你會想要做一些像head = makeCopy(list.head)。或者甚至更好,如果你已經瞭解了字段初始值,然後使用字段初始化。 /<編輯2 > *

+0

我完全錯過了Vaughn和Luchian指出的那些顯而易見的事實。一旦編譯完成,你仍然會遇到我提到的問題。 – Martin 2012-08-03 04:43:37

+0

ListNode構造函數「ListNode(double v,ListNode * p)」是賦值的一部分。一個讓我頭痛的問題.. – NealR 2012-08-04 00:41:01

+0

這很好。只需用'ListNode * newNode = new Node(node-> value,NULL);'創建新節點,然後根據需要設置newNode-> next(因爲LinkedList是LinkedNode的朋友)。 – Martin 2012-08-04 22:21:51

0

如果我理解正確的分配新建分配FY「makeCopy」採用指向節點的鏈表,必須創建這個鏈表的副本,並返回指向第一個元素,對不對?

以下是我認爲需要做的事情:

LinkedList::LinkedList(LinkedList &list) 
    : head(makeCopy(list.head)) 
{ 
} 

ListNode* LinkedList::makeCopy(ListNode *pList) 
{ 
    if (!pList) 
    { 
     return 0; 
    } 

    ListNode* head = new ListNode(plist->value, 0); 
    ListNode* back = head; 
    plist = plist->next; 

    while (pList) 
    { 
     ListNode* newNode = new ListNode(plist->value, 0); 
     back->next = newNode; 
     back = newNode; 
     plist = plist->next; 
    } 

    return head; 
} 
+2

我認爲在回答這些作業問題時最好着重解釋概念和技巧,而不是提供實際的解決方案。與獲得正確的解決方案相比,提問者更多地理解解決方案。 – Martin 2012-08-03 05:26:11