2016-12-03 81 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',所以它也會刪除第一個元素if我設置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(這是未定義的行爲)。