所以我试图为链表创建一个复制构造函数。我在复制构造函数中尝试了一堆不同的方法,但它们似乎都没有工作。任何人都可以告诉我应该做些什么来改进代码?
Stack::Stack(Stack*StkIn)
{
top = NULL;
numItems = 0;
node* oPtr = StkIn->top;
node* nPtr = top;
while (oPtr != NULL)
{
nPtr->item = oPtr->item;
nPtr = nPtr->next;
oPtr = oPtr->next;
}
}
答案 0 :(得分:0)
尝试以下代码:
Stack::Stack(Stack*StkIn)
{
top = NULL;
numItems = 0;
node* oPtr = StkIn->top;
node* nPtr = new Stack();
node* npPtr = NULL;
while (oPtr != NULL)
{
npPtr = new Stack();
nPtr->item = oPtr->item;
nPtr->next = npPtr;
nPtr = npPtr;
oPtr = oPtr->next;
}
}
答案 1 :(得分:0)
如果您希望将其作为复制构造函数,则应更改签名以接受const
引用:
Stack::Stack(const Stack& StkIn)
{
top = NULL;
numItems = 0;
node* oPtr = StkIn.top;
node* nPtr = top; // this sets nPtr to NULL
while (oPtr != NULL)
{
nPtr->item = oPtr->item; // then you dereference nPtr - initially NULL!!!!
nPtr = nPtr->next;
oPtr = oPtr->next;
}
}
你需要在循环中做一个new node;
来分配内存,然后设置数据成员。并且您没有将top
更新为指向第一个新节点。
退一步,你应该学习如何解决这些问题。写下纸上写着:
[oPtr = StkIn.top = NULL]
[oPtr = StkIn.top] ----> [node:{item1,next=NULL]
[oPtr = StkIn.top] ----> [node:{item1,next--]----> [node:{item2,next=NULL]
这是三个测试用例...如果你能证明你的代码适用于所有三个,那么它可能适用于列表中的任意数量的节点。
对于其中的每一个,请逐行遵循您的代码,计算变量将保留的内容,并查看说明是否正确地将StkIn
复制到新内存。例如,最后一个应该产生类似的东西:
[top] ----> [node:{item1,next--]----> [node:{item2,next=NULL]
在纸上制作你的逻辑对于这些问题非常有用....