2015-05-13 96 views
0

以下是具有节点结构的类,链表副本构造函数和我的主文件。它将打印第一个列表中的数字,并仅将第一个数字(15)复制到第二个列表中。它调用两个列表的析构函数,程序正常关闭。无论我尝试多么努力,我都无法弄清楚这个拷贝构造函数,它真的开始打扰我了。复制构造函数不适用于链接列表?

#ifndef LINKEDLIST_H 
#define LINKEDLIST_H 
#include <iostream> 
using namespace std; 

// Declare a class for the list 
class LinkedList 
{ 
private: 
    // Declaring a structure for the list 
    struct ListNode 
    { 
     // Integer value in the node and pointer to the next node 
     int value = NULL; 
     struct ListNode* next = nullptr; 
    }; 

    // List head pointer 
    ListNode* head = nullptr; 
public: 
    // Constructor 
    LinkedList() { head = nullptr; }; 

    // Copy constructor 
    LinkedList(const LinkedList &); 

    // Destructor 
    virtual ~LinkedList(); 

    // Linked list operations 
    void appendNode(int); 
    void insertNode(int); 
    void deleteNode(int); 
    void printList() const; 
    void reverseList() const; 
    int searchList(const int) const; 
}; 

#endif // LINKEDLIST_H 

LinkedList::LinkedList(const LinkedList& listObj) 
{ 
    ListNode* newNode = nullptr; // Create new node 
    ListNode* copyPtr = nullptr; // Point to original object 

    copyPtr = listObj.head; 

    newNode = new ListNode; 
    this->head = newNode; 
    head->value = copyPtr->value; 
    copyPtr = copyPtr->next; 

    while(!copyPtr) 
    { 
     newNode->next = new ListNode; 
     newNode = newNode->next; 
     newNode->value = copyPtr->value; 
     copyPtr = copyPtr->next; 
    } 
} 

#include "LinkedList.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    LinkedList list1; 
    list1.appendNode(15); 
    list1.appendNode(20); 
    list1.appendNode(25); 

    list1.printList(); 

    LinkedList list2 = list1; 

    list2.printList(); 

    return 0; 
} 

回答

3

您的循环条件不正确。你想循环时有下一个节点。你正在做相反:

while(!copyPtr) 

应该是:

while (copyPtr) 

还要注意你的拷贝构造函数将是不正确的,如果你从复制列表是空的。您在进行任何检查之前取消listObj.head

1

我发现两个问题与您的代码:

  1. 你不检查listObj是否nullptr
  2. 随着while循环的结束,您不会将newNode->next设置为nullptr
+0

为什么我会在while循环结束时执行'newNode-> next = nullptr'? – bigZigZag

0

谢谢你们的帮助!更改为while(copyPtr)使其工作。这样愚蠢的错误。对此,我真的非常感激。

LinkedList::LinkedList(const LinkedList& listObj) 
{ 
    ListNode* newNode = nullptr; // Create new node 
    ListNode* copyPtr = nullptr; // Point to original object 

    if(!listObj.head) 
     return; 
    else 
    { 
     copyPtr = listObj.head; 

     newNode = new ListNode; 
     this->head = newNode; 
     head->value = copyPtr->value; 
     copyPtr = copyPtr->next; 

     while(copyPtr) 
     { 
      newNode->next = new ListNode; 
      newNode = newNode->next; 
      newNode->value = copyPtr->value; 
      copyPtr = copyPtr->next; 
      newNode->next = nullptr; 
     } 
    } 
} 
相关问题