C++ C++;链表将节点添加到末端
我似乎对以下部分有问题,我得到的最新例外是: LinkedList.exe中0x01321A01处的未处理异常:0xC0000005:访问冲突写入位置0x00000020 我在谷歌搜索了好几个小时,也搜索了我的书,但似乎找不到我需要的答案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
//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
)首先,停止删除内容。您正在添加到此列表中。第二如果你