该功能应该从链接列表中删除元素。目前,它确实可以胜任工作,但是通过进一步测试,我发现使用该功能约2-3次后出现了分段错误。例如,假设listA
包含1 2 3 4 4 5
,则当我执行remove listA 4
然后打印listA
的元素时,输出应该是1 2 3 5
。但是,当我在列表上再使用1-2次删除功能时,它停止工作,并且不断出现分段错误。我不确定为什么。任何帮助将不胜感激!
void mylist::remove(int z)
{
Node *currP, *prevP;
prevP = NULL;
for (currP = head;
currP != NULL;
prevP = currP, currP = currP->next) {
if (currP->key == z) {
if (prevP == NULL) {
head = currP->next;
} else{
prevP->next = currP->next;
}
delete currP;
currP=prevP;
numberofnodes--;
}
}
return;
}
最佳答案
您不处理删除第一个节点表单列表的情况,因为prevP
为空。删除currP
后,您将分配currP=prevP;
。在下一次迭代中,当为下一次for循环迭代执行prevP = currP, currP = currP->next
时,将导致分段错误。
您可以改用while循环,例如:
void mylist::remove(int z)
{
Node *currP, *prevP, *temp;
prevP = NULL;
currP = head;
while(currP != NULL){
if (currP->key == z) {
if (prevP == NULL) {
head = currP->next;
} else{
prevP->next = currP->next;
}
temp = currP;
currP = currP->next;
delete temp;
numberofnodes--;
}
else
{
prevP = currP;
currP = currP->next;
}
}
return;
}