我是C ++和一般编程的菜鸟,我试图制作一个复制链表的构造函数。我的想法是我可以使用
Individual* copyOfList = new Individual(originalList->getFirstBit());
制作原始列表的深层副本。
但我的下面似乎并没有做深刻的复制。当我修改copyOfList
时,originalList
也会受到影响。我不明白链接列表足以使其深入复制。有人可以帮帮我吗。
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;
}
}
答案 0 :(得分:2)
head = copyHead;
通过上述语句,head
指向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;
}
}
希望它有所帮助!
答案 1 :(得分:1)
我假设Individual
是你代码中的一个类,基本上它正在保持列表的头部位置。我的意思是:
class Individual{
private:
void* head;// may be anything*
public:
void* getHead()
{
return head;
}
// all the methods
}
现在c ++提供了一种特殊类型的构造函数,即复制构造函数。如果没有定义一个编译器,则提供一个复制构造函数的默认副本,它复制一个对象的浅表副本。要定义自定义复制构造函数:
首先在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;
}
}
现在你想要深层复制你必须实现一个代码,它将从头部指针开始复制整个列表。