由于某种原因,我从列表中间删除节点的功能是删除第一个节点而不是用户指定的节点。这是我的功能:
template< class NODETYPE >
bool List< NODETYPE >::removeMiddle( NODETYPE &value, int i )
{
ListNode <NODETYPE> * tempPtr = firstPtr;
int counter=1;
if ( isEmpty() )
return false;
if (i <= 0)
return false;
while (tempPtr != 0 && counter < i){
counter++;
if ( firstPtr == lastPtr )
firstPtr = lastPtr = 0;
else
firstPtr = firstPtr->nextPtr;
if (counter == i){
value = tempPtr->data; // data being removed
delete tempPtr;
}
}
return true;
RecordCounter--;
}
任何人都可以帮我指出正确的方向吗?
答案 0 :(得分:1)
我假设是因为这个:
if ( firstPtr == lastPtr )
firstPtr = lastPtr = 0;
else
firstPtr = firstPtr->nextPtr;
应检查并修改tempPtr
,而不是firstPtr
。
由于您未按tempPtr
进行检查,因此您的函数会调用
if (counter == i){
value = tempPtr->data; // data being removed
delete tempPtr;
}
但tempPtr
最初设置为firstPtr
,之后从未修改过。
当然,您可以通过稍微调试轻松发现这一点,所以我不会为您更正代码,但这是一个很好的起点。
答案 1 :(得分:0)
我不知道lastPtr
的用途,但问题是您通过更改firstPtr
而不是tempPtr
进行迭代。然后删除tempPtr
,但仍然指向列表的头部。
答案 2 :(得分:0)
这是因为您已分配tempPtr = firstPtr
而不是递增tempPtr
,而是递增firstPtr
。
检查以下代码。
while (tempPtr != 0 && counter < i)
{
counter++;
if ( firstPtr == lastPtr)
firstPtr = lastPtr = 0;
else
tempPtr = tempPtr->nextPtr; // Here tempPtr should be incremented not firstPtr
if (counter == i)
{
value = tempPtr->data; // data being removed
delete tempPtr;
}
}