使用递归c ++从列表中删除元素

时间:2016-12-03 13:36:28

标签: c++

我有这个函数应该删除多个输入数字的元素。

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

我该如何解决这个问题?

2 个答案:

答案 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);
    }
}