2014-02-20 46 views
1

所以我用C再造一个LinkedList ++,我试图改变指针到最后Node我的列表中。这里是我的超载+=运营商所有的魔术和错误发生。我有两种不同的方法来改变指针,但都抛出Unhandled exception at 0x00ee42f3 in Lab3.exe: 0xC0000005: Access violation writing location 0xccccccec.。发生了什么事情,我该如何解决它?C++在链接列表设置下一个节点指针

void MyLinkedList::operator+=(const std::string& s) 
{ 
    allocator<Node> a; 
    Node* n = a.allocate(1); 
    a.construct(n, s); 


    if (first == NULL) 
     first = n; 
    else 
    { 
     (*last).next = n; // crashes here 
     (*last).SetNext(n); //also will crash here, if the previous statement is removed 
     last = n; 
    } 
} 

为了进一步澄清,它会经过并设置第一Node,退出方法,而下一次它被称为将运行并进入else声明。此时有第二个Node,它在内存中分配并实例化。我试图做的是设置Node* next指针在第一Node这个新Node,但它抛出异常。对不起,最初很模糊。

+5

我们不知道任何这些值是,无论他们是有效的,你的计划是当它到达这个阶段什么状态,什么SetNext()呢,等你还没有告诉我们到底是哪线路导致问题。你用过调试器吗? – PaulMcKenzie

+0

你确定a.allocate返回一个有效的指针吗?另外如果最后一个是NULL,你可能会发现你的一个崩溃。 –

+0

对于一个'operator + ='不应该返回一个void。 – jaho

回答

2

我们不知道allocateSetNext具体实现。

如果他们都没有问题,请看看这里:

if (first == NULL) 
{ 
    first = n; 
    last = first; // You should assign last with the head node pointer. 
} 
... 

也许帮助。

+0

修好了!非常感谢!编辑:我知道它为什么修复它。我觉得很愚蠢,我从来没有给任何东西设置'最后的'...愚蠢的错误... – user3280133

+0

你需要知道为什么,而不是依靠“魔术”。回去理解你做错了什么。如果列表为空,则不会初始化“最后一个”指针。但后来,你使用指向who-knows-where的“last”指针,并试图写入这个地址。 – PaulMcKenzie

1

您的运营商+ =有很多的问题。

1)运算符+ =应该返回这个的引用,而不是void。否则a + = b是没有意义的。

MyLinkedList& MyLinkedList::operator+=(const std::string& s) 
{ 
    //... 
    return *this; 
} 

2)其次,如果列表为空,您的最后一个指针可能未被初始化。

3)风格的问题 - 你为什么这样做:

(*last).next = n; 

时,你应该只是这样做:

last->next = n;