2016-12-03 10 views
1

私は入力番号の倍数である要素を削除する必要があるこの関数を持っています。再帰でリストから要素を取り除くC++

0 28992848 28992816 28992784 28992752 28992720 28992688 28992656 28992624 28992592 

どのように私はこの問題を解決することができます:私の印刷機能は私にこれを提供しますので、問題は、要素が削除されているということですが、nullではありませんが、0から10まで、リスト上でこれを実行する

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

動作していないため、セグメント化エラーが発生します。 – 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'を取得すると、最初の要素も削除されます私はn = 1に設定します。 – slash89mf

+0

@ slash89mf正しく呼んでいますか?つまり、 'mylist = rmv_mul(mylist、4)'ですか? – dasblinkenlight

+0

はい、私の主な私はこれを持っています: 'q = rmv_mul(q、x);' – slash89mf

1

も、これらの2行は、すでにあなたが問題をした示し、あなたのロジックに従うことをしようとせず:

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

理由は、delete p(括弧は不要、btw)以降はp->nextにアクセスできません(未定義の動作です)。

関連する問題