如果数据与特定值匹配,我一直在尝试删除节点。
这是我的删除值方法:
void del_value(int data)
{
Node *temp = head;
int i = 0;
while(temp!=NULL)
{
if(temp->data == data)
{
del_index(i);
i--; // Since the nodes count will be reduced after deleting, reducing the index by one.
}
i++;
temp = temp->next;
}
}
这是我的del_index方法(工作正常):
int getCount()
{
int i = -1;
Node *temp = head;
while(temp!=NULL)
{
temp = temp->next;
i++;
}
return i;
}
void del_index(int pos)
{
int count = getCount();
if(pos == 0)
{
del_start();
}
else if(pos == count)
{
del_last();
}
else if(pos<0 || pos>count)
{
cout<<"Out of range"<<endl;
return;
}
else
{
int i = 1;
Node *temp = head;
while(i<pos)
{
temp = temp->next;
i++;
}
Node *toDel = temp->next;
Node *forward = toDel->next;
temp->next = forward;
delete toDel;
}
}
这是我的主要方法:
int main()
{
Mylist l;
l.add_start(4);
l.add_start(4);
l.add_start(4);
l.del_value(4);
l.show();
}
但它在内部循环中达到del_value方法时会卡住。知道我在哪里错过了吗?
更新:(添加了del_first和del_last方法
void del_start()
{
if(head == NULL)
{
cout<<"List is empty"<<endl;
return;
}
else
{
Node *temp = head;
head = head->next;
delete temp;
}
}
void del_last()
{
if(head == NULL)
{
cout<<"List is empty"<<endl;
return;
}
else
{
Node *temp = head;
while(temp->next != NULL)
{
tail = temp;
temp = temp->next;
}
tail->next = NULL;
delete temp;
}
}
答案 0 :(得分:1)
你的del_value方法不起作用,因为你删除了临时指向的对象&#39; temp&#39;然后你取消引用它(使用&#34; temp = temp-&gt; next&#34;)。
对于您的示例代码,我会缓存&#39; next&#39;条件之前的值,例如:
Node *next = temp->next;
if(temp->data == data)
{
del_index(i);
i--;
}
i++;
temp = next;
我假设您为了练习目的而这样做,但我会添加以下建议:
我不会在这里调用del_index,但在del_value方法中删除内联节点。因为你有必要的指针,能够删除它。 del_index必须再次遍历您的列表。
我还建议在stl中使用容器,而不是自己滚动容器,以避免遇到这样的问题。