我有这个函数应该删除多个输入数字的元素。
ptr_lista rmv_mul(ptr_list p,int n){
if(p==NULL){
return(p);
}
if (p->val%n==0){
ptr_list tmp;
tmp = p->next;
delete(p);
rmv_mul(p->next,n);
return (p);
}
else{
rmv_mul(p->next,n);
return (p);
}
}
在0到10的列表上执行此操作,问题是元素被删除但不是null,所以我的print函数给了我这个:
0 28992848 28992816 28992784 28992752 28992720 28992688 28992656 28992624 28992592
我该如何解决这个问题?
答案 0 :(得分:1)
如果没有尝试遵循您的逻辑,这两行已经显示出您的问题:
delete(p);
rmv_mul(p->next,n);
原因是在delete p
之后(不需要括号,顺便说一下),您不能访问p->next
(它的未定义行为)。
答案 1 :(得分:0)
问题是你的代码忽略了rmv_mul
的返回值,即使这是新的列表指针。您的代码应该返回p
返回的任何内容,而不是在第一个分支中返回rmv_mul
:
ptr_lista rmv_mul(ptr_list p,int n){
if(p==NULL){
return(p);
}
if (p->val%n==0){
ptr_list tmp = p->next;
delete(p);
return rmv_mul(tmp, n); // <<== Pass tmp, not p; p is deleted
} else {
p->next = rmv_mul(p->next, n); // <<== Assign to p->next
return (p);
}
}