3

我是 C++ 和一般编程的菜鸟,我正在尝试制作一个复制链表的构造函数。这个想法是我可以使用

 Individual* copyOfList = new Individual(originalList->getFirstBit());

制作原始列表的深层副本。

但我下面的 cose 似乎没有做深拷贝。当我编辑时,copyOfListoriginalList也会受到影响。而且我对链表的理解不足以使其成为深拷贝。有人能帮助我吗。

Individual::Individual(BinaryNode * copyHead)
{
    head = copyHead;
    NodePtr last = NULL;
    NodePtr temp = NULL;
    curr = head;
    while (curr != NULL)
    {
        temp = new BinaryNode(curr->data, NULL);

        if (last != NULL)
        {
            last->next = temp;
        }

        last = temp;

        if (head == NULL)
        {
            head = temp;
        }

        curr = curr->next;
    }
}

这是 BinaryNode 代码

class BinaryNode
{
public:
BinaryNode();
BinaryNode(bool the_data, BinaryNode *next_link);

bool data;
BinaryNode *next;
private:
}; 

这是原始列​​表代码。我认为我填充它的顺序增加了头部。

if(the_length > 0)
{
    srand(time(NULL));
    int randnumber;
    NodePtr temp = new BinaryNode;
    for(int i = 0; i < the_length; i++)
    {
        randnumber=(rand() % 2);
        temp = new BinaryNode(randnumber,head);
        head = temp;
    }
}
4

2 回答 2

2
head = copyHead;

使用上面的语句,headis 指向的内存位置与copyHead所指向的内存位置相同。未在空列表中输入循环。但在循环中 -

if (head == NULL)
{
    head = temp;
}

在要复制的具有子项的链表上永远不会出现这种情况。因此,您永远不会更新head链表的,而是仍然指向要复制的链表的起始节点。尝试 -

Individual::Individual(BinaryNode * copyHead)
{
    if (NULL == copyHead)
    {
       // Empty list
       return;
    }

    head = new BinaryNode(copyHead->data, NULL);

    curr     = head;
    copyHead = copyHead->next;

    while (NULL != copyHead)
    {
        // Copy the child node
        curr->next     = new BinaryNode(copyHead->data, NULL);

        // Iterate to the next child element to be copied from.
        copyHead = copyHead->next;

        // Iterate to the next child element to be copied to.
        curr     = curr->next;
    }
}

希望能帮助到你 !

于 2013-09-07T13:43:09.693 回答
1

我假设Individual你的代码中有一个类,基本上它占据了列表的首位。我是说:

class Individual{
private:
void* head;// may be anything*
public:
void* getHead()
{
return head;
}
// all the methods
}

现在 c++ 提供了一种特殊类型的构造函数,即Copy Constructor。如果您没有定义一个编译器,请提供复制构造函数的默认副本,该副本执行对象的浅拷贝。要定义您的自定义复制构造函数:首先添加一个新方法BinaryNode

void link(BinaryNode& b)
{
b.next=this;
}


    Individual::Individual(const Individual& args)
    {
    void* copyHead = args.getHead()
    if ( copyHead==nullptr)
        {
           // Empty list
           return;
        }

    head = new BinaryNode(copyHead->data, NULL);

    curr     = head->next;
    copyHead = copyHead->next;
    temp = head;
    while (NULL != copyHead)
    {
        // Copied the child node
        curr     = new BinaryNode(copyHead->data, NULL);
        curr.link(temp);
        temp = curr;

        // Iterate to the next child element to be copied from.
        copyHead = copyHead->next;

        // Iterate to the next child element to be copied to.
        curr     = curr->next;
    }
}

现在,当您想要进行深度复制时,您必须实现一个代码,该代码将从头指针开始复制整个列表。

于 2013-09-07T14:12:36.130 回答