2016-12-03 2 views
1

У меня есть эта функция, которая должна удалять элементы, кратные номеру ввода.Удалить элементы из списка с рекурсией 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, проблема состоит в том, что элементы будут удалены, но не нулевой, так что моя функция печати дает мне это:

0 28992848 28992816 28992784 28992752 28992720 28992688 28992656 28992624 28992592 

Как я могу решить эту проблему ?

+0

Не работает, я получаю ошибку сегментации. – slash89mf

+0

Вы должны сначала попытаться удалить 3 узла, и когда вы получите эту работу, а затем посмотрите, работает ли она на 10 узлов. Таким образом, с ними становится легче работать. – PaulMcKenzie

+0

Это было бы очень легко с помощью функции 'std :: list'' remove_if' ... –

ответ

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); 
    } 
} 
+0

Не работает, теперь я получаю '15353168 15353136 15353104 15353072 15353040 15353008 15352976 15352944 15352912', поэтому он также удаляет первый элемент, если i set n = 1 – slash89mf

+0

@ slash89mf Вы вызываете его правильно, то есть 'mylist = rmv_mul (mylist, 4)'? – dasblinkenlight

+0

Да, в моем основном я это: 'q = rmv_mul (q, x);' – slash89mf

1

даже не пытаясь следовать вашей логике эти две линии, которые уже показывают у Вас есть проблема:

delete(p); 
rmv_mul(p->next,n); 

Причина в том, что после delete p (нет необходимости в скобках, кстати) вам не разрешен доступ p->next (это неопределенное поведение).