0

我有一个链表类。它包括一个复制构造函数:

LinkedListStorage(const LinkedListStorage &other) :root(NULL)
{
    size = other.size;
    count = other.count;
    node *cur = other.root;
    node *end = NULL;

    while(cur->next != NULL)
    {
        node* x = new node;
        x->word = cur->word;

        if(!root)
        {
            root = x;
            end = root;
        }
        else
        {
            end->next = x;
            end = x;
        }

        cur = cur->next;
    }
}

在类中,我通过一种将链接列表写入文件的方法运行它,但是,虽然所述方法适用于原始列表,但列表的复制版本会导致访问冲突,逐步遍历列表作为列表的最终条目被复制按预期指向 0x00000000,但是当它到达写入函数时,最后一个节点的指针最终指向 0xcdcdcdcd,在尝试复制和使用写入函数之间没有代码运行,所以它必须是复制构造函数,但是我一生都无法弄清楚哪里出了问题。

在此先感谢您的帮助!

4

3 回答 3

1

我认为问题是你没有复制最后一个元素。改变:

while(cur->next != NULL)

while(cur != NULL)
于 2013-05-07T10:25:33.287 回答
1

您正在存储指向列表中最后一个条目的指针,end但是在遍历列表时,您检查的->next != NULL似乎没有设置在end. 我不确定这是导致您当前问题的原因,但它似乎是错误的。:)

编辑:由于您还存储了列表的长度,因此count您拥有三重冗余信息:

  1. end
  2. ->next == NULL
  3. count 如果你真的需要它们,你必须小心保持它们同步。

另外:如果可以的话,你应该使用 nullptr 而不是 NULL。

于 2013-05-07T10:26:15.647 回答
1

很难说没有看到课堂的其余部分,但也许你需要初始化x->next,即

node* x = new node;
x->word = cur->word;
x->next = NULL;
于 2013-05-07T10:48:21.700 回答