我似乎遇到了以下细分问题,我得到的最新例外是:
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;
}
答案 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
)