2017-04-25 7 views
0

私は特に素数でない数字をリストから削除するためにふるい素数法を使用しようとしています。私は作業しているプログラムを持っていますが、これまでリストには素数はありませんが、17や29などの素数も削除されてしまいます。 2〜32です。 これは私のコードです。リンクリストを持つ篩の素数

#include <stdio.h> 
#include <stdlib.h> 
typedef struct node{ 
    int data; 
    struct node *next; 
}node; 
node *Inserttail(node *head, int x){ 
    node *temp = (node*)malloc(sizeof(node)); 
    temp->data = x; 
    temp->next = NULL; 
    node *temp1 = head; 
    if(head==NULL) 
     return temp; 
    else if(head->next ==NULL){ 
     head ->next = temp; 
     return head; 
    } 
    while(head->next != NULL) 
     head = head->next; 
    head->next = temp; 
    return temp1; 
} 
void Print(node *head){ 
    while(head != NULL){ 
     printf(" %d", head->data); 
     head = head ->next; 
    } 
} 
node *Deletemultiples(node *head, int k){ 
    node *temp = head, *old = temp; 
    int i = 1; 
    while(temp!=NULL){ 
     if(i%k==0 && i!= k) 
      old->next = temp->next; 
     old=temp; 
     temp= temp->next; 
     i++; 
    } 
    return head; 
} 
int main(){ 
    node *head = NULL; 
    int i; 
    for(i=1; i<=1000; i++) 
     head = Inserttail(head, i); 
    for(i=2; i<=32; i++) 
     head = Deletemultiples(head, i); 
    Print(head); 
    return 0; 
} 

これは私が今取得しています、私の出力です:

1 2 3 5 7 11 13 19 23 31 35 43 49 59 61 79 83 103 109 119 133 151 155 175 193 211 215 241 259 275 283 323 331 361 373 403 419 443 455 499 511 541 571 613 623 649 673 719 733 781 803 841 871 919 931 991 

私から実際に自由にその特定のリンクのことができるようにするために、私は今も使っていることも効果的ではない方法リスト。あなたはそれを使用するべきではありませんので

int i = 1; 
while (temp != NULL) { 
    if (i % k == 0 && i != k) 
     /* … Other stuff … */ 

この場合iは、あなたのリストとは関係ありません:あなたのDeletemultiples機能で

+2

利用代わりに '' i'のdata'を。また、メモリリークがあります。 – BLUEPIXY

+0

注:一般に '1'は素数ではありません。 – BLUEPIXY

+1

といつものように、['malloc'の結果を出さないでください](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –

答えて

2

は、次のような持っています。代わりに、あなたはあなたのnode構造のdataメンバーを見てみたい:

while (temp != NULL) { 
    if (temp->data % k == 0 && temp->data != k) 

そして、これはあなたが捜している結果を得られます:

1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 … 
+0

私はこれを間違った方法でやっていたと思います。 –

関連する問題