C ++链接列表将节点添加到结尾

时间:2014-03-11 02:06:31

标签: c++ linked-list

我似乎遇到了以下细分问题,我得到的最新例外是:

LinkedList.exe中0x01321A01处的未处理异常:0xC0000005:访问冲突写入位置0x00000020。

我一直在谷歌搜索几个小时,以及我的书,我似乎无法得到我需要的答案。

//add a node (pNode) at the tail of the list.  
//return a pointer to the head node
ListNode* addEnd( ListNode* pHead, ListNode* pNode )
{

    ListNode* pCurr = pHead;

    while( pCurr != NULL )
    {
        if(pCurr->pNextNode == NULL)
            break;

        pCurr = pCurr->pNextNode;

        if(pCurr->pNextNode == NULL)
            break;
    }

    pCurr->pNextNode = pNode;

    delete [] pCurr;

    return pHead;
}

3 个答案:

答案 0 :(得分:1)

我认为delete [] pCurr;可能会导致问题

你不要在这里删除pCurr,因为你不是新的任何内存,温度指针会在函数结束时自行破坏,而删除[]则是数组。

答案 1 :(得分:1)

首先,我将更改while循环并按照以下代码进行操作:

while (pCurr != NULL && pCurr->pNextNode != NULL)
{ pCurr = pCurr->pNextNode; }

if (pCurr != NULL)
{ pCurr->pNextNode = pNode; }
else
{ pHead = pNode; pNode->pNextNode = NULL; }

return (pHead);

即,删除delete [] pCurr行。首先,您使用的是数组删除操作符delete [],这是不正确的(这就是您获取访问冲突错误的原因)。其次,您不希望释放pCurr指向的数据,因为它现在是链接列表中的节点之一。

答案 2 :(得分:1)

首先,停止删除内容。您正在添加到此列表中。第二。如果您的列表为空(pHead为空),即使没有delete[],您的代码也会调用未定义的行为(无论如何都应该取出)。

有多种方法可以做到这一点,虽然我更喜欢以下内容,因为它减少了对特殊情况的head-is-null检查的需要

ListNode* addEnd( ListNode* pHead, ListNode* pNode )
{
    ListNode** pp = &pHead;
    while (*pp)
       pp = &(*pp)->pNextNode;
    *pp = pNode;
    return pHead;
}

注意:这假设您在进入此功能之前正确终止了您的pNode->pNextNode指针(不管您应该这样做)。

如何运作

指针指向的东西。这可能看起来微不足道,但语言允许你指向几乎任何东西(不是引用)。这包括其他指针。如果这样:

ListNode *p;

声明一个指向ListNode的指针,然后是:

ListNode **pp = &p;

声明一个指向ListNode指针的指针。

我们使用其中一个,最初持有pHead参数的地址,遍历链表,每一步加载地址来自当前节点的pNextNode指针。当我们最终到达一个null的指针时,我们指向我们遇到的用ListNode*设置的pNode指针。作为奖励,即使pHead在开始时为空,这也是有效的,并且您只需返回pHead作为函数结果(如果列表为空,则现在填充pNode