复制构造函数不适用于链表?

时间:2015-05-13 02:16:13

标签: c++ c++11 linked-list copy-constructor

以下是具有节点结构,链接列表复制构造函数和主文件的类。它在第一个列表中打印数字,它只将第一个数字(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 个答案:

答案 0 :(得分:3)

您的循环条件不正确。您希望在 下一个节点时循环。你正在做相反的事情:

while(!copyPtr)

应该是:

while (copyPtr) 

另请注意,如果您要复制的列表为空,则复制构造函数将不正确。在进行任何检查之前,请取消引用listObj.head

答案 1 :(得分:1)

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

  1. 您不会检查listObj是否为nullptr
  2. 在while循环结束时,您不会将newNode->next设置为nullptr

答案 2 :(得分:0)

谢谢你们的帮助!更改为while(copyPtr)使其工作。这样一个愚蠢的错误。我真的很感激。

@Transactional
public void savePerson(Person person){
...
}