复制链接列表C ++的构造函数

时间:2014-03-27 04:13:33

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

所以我试图为链表创建一个复制构造函数。我在复制构造函数中尝试了一堆不同的方法,但它们似乎都没有工作。任何人都可以告诉我应该做些什么来改进代码?

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;
 }
}

2 个答案:

答案 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]

在纸上制作你的逻辑对于这些问题非常有用....