C++ C++;链表将节点添加到末端

C++ C++;链表将节点添加到末端,c++,linked-list,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* p

我似乎对以下部分有问题,我得到的最新例外是:

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

我认为
delete[]pCurr可能导致此处出现问题


您不应该在这里删除pCurr,因为您在这里不是新的内存,临时指针将在函数末尾销毁自身,另外delete[]用于数组。

我认为
delete[]pCurr可能导致此处出现问题


您不应该在这里删除pCurr,因为您在这里不是新的内存,临时指针将在函数末尾销毁自身,另外delete[]用于数组。

我认为
delete[]pCurr可能导致此处出现问题


您不应该在这里删除pCurr,因为您在这里不是新的内存,临时指针将在函数末尾销毁自身,另外delete[]用于数组。

我认为
delete[]pCurr可能导致此处出现问题


您不应该在这里删除pCurr,因为您在这里不是新的内存,临时指针将在函数末尾自我销毁,另外delete[]用于数组。

首先,我将while循环和以下代码更改为:

while(pCurr!=NULL&&pCurr->pNextNode!=NULL)

{pCurr=pCurr->pNextNode;}

如果(pCurr!=NULL)

{pCurr->pNextNode=pNode;}

else

{pHead=pNode;pNode->pNextNode=NULL;}

返回(pHead)


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

首先,我将while循环和以下代码更改为:

while(pCurr!=NULL&&pCurr->pNextNode!=NULL)

{pCurr=pCurr->pNextNode;}

如果(pCurr!=NULL)

{pCurr->pNextNode=pNode;}

else

{pHead=pNode;pNode->pNextNode=NULL;}

返回(pHead)


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

首先,我将while循环和以下代码更改为:

while(pCurr!=NULL&&pCurr->pNextNode!=NULL)

{pCurr=pCurr->pNextNode;}

如果(pCurr!=NULL)

{pCurr->pNextNode=pNode;}

else

{pHead=pNode;pNode->pNextNode=NULL;}

返回(pHead)


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

首先,我将while循环和以下代码更改为:

while(pCurr!=NULL&&pCurr->pNextNode!=NULL)

{pCurr=pCurr->pNextNode;}

如果(pCurr!=NULL)

{pCurr->pNextNode=pNode;}

else

{pHead=pNode;pNode->pNextNode=NULL;}

返回(pHead)


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

首先,停止删除内容。您正在添加到此列表中。第二如果列表为空(
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 **pp = &p;
声明指向ListNode指针的指针


我们使用其中的一个,最初持有
pHead
参数的地址,遍历链表,每一步从当前节点加载
pNextNode
指针的地址。当我们最终得到一个空指针时,我们指向的正是我们要用
pNode
设置的
ListNode*
指针。作为奖励,即使
pHead
在开始时为空,并且您总是简单地返回
pHead
作为函数结果(如果列表为空,现在填充了
pNode

首先,停止删除内容。您正在添加到此列表中。第二如果你