2013-09-23 87 views
0

我試圖添加一些鏈接列表到我的遞歸質數編碼,我能夠存儲使用鏈接列表的值,然後當我要檢索兩個素數之間的質數輸入的數字我得到了這個結果。素數使用鏈接列表和遞歸在渦輪c

輸入端1和5:1, 21, 301, 5

輸出應爲:

2,3,5

的代碼是:

#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 

struct node 
{ 
    //struct node *prev; 
    int num; 
    struct node *nxt; 
}*head; 

void store(int value){ 
    struct node *var, *temp; 
    var = (struct node *)malloc(sizeof(struct node)); 
    var->num = value; 
    if(head==NULL){ 
     head = var; 
     head->nxt = NULL; 
    }else{ 
     temp = var; 
     temp->nxt = head; 
     head=temp; 
    } 
} 

void accept(int value, int i){ 
    if(i<2){ 
     printf("Enter value: "); 
     scanf("%d", &value); 
     store(value); 
     i++; 
     accept(value,i); 
    } 
} 

void prime(){ 
    int num,x,y; 
    struct node *temp,*temp2,*var; 
    temp = head; 
    temp2 = temp->nxt; 
    y = temp->num; 
    x = temp2->num; 
    primeloop(x,y); 
} 

int primeloop(int x,int y){ 
    int num; 
    if (x == 1) x++; 
    if(x <= y){ 
     num = isPrime(x,2); // second input parameter added 
     printf("%d",num); 
     if(num == 0){ 
      printf(""); 
     }else{ 
      printf("%5d",x); 
     } 
     primeloop(x+1,y); 
    } 
} 

int isPrime(int n, int i){ 
    if(n%i==0 && n!=2 && n!=i){ 
     return(0); 
    } else { 
     if (i < sqrt(n)) { 
     return(isPrime(n,i+1)); 
    } else 
    return(1); 
    } 
} 

void main(){ 
    int i,value; 
    clrscr(); 
    i = 0; 
    accept(value,i); 
    prime(); 
    getch(); 
} 

我不得不改變一些行來使它和鏈表一起工作,因爲算法仍然是一樣的,所以我可能會在這裏丟失一些東西。請指出我做錯了什麼。

+0

側面說明:'head'沒有得到很好的初始化。更好的是...... head = NULL。注意; NULL並不總是0. – chux

+0

@chux會記住這一點,謝謝 – magicianiam

回答

1

我發現你的問題,我想。你的算法是正確的,但你有兩個冗餘printf

primeloop應該是這樣的

int primeloop(int x,int y){ 
    int num; 
    if (x == 1) x++; 
    if(x <= y){ 
     num = isPrime(x,2); // second input parameter added 
     if(num != 0){ 
      printf("%5d ",x); 
     } 
     primeloop(x+1,y); 
    } 
} 
+0

哦,謝謝,不敢相信我錯過了,我只是先把它放在第一位,如果要檢查num,無論如何謝謝你指出我明顯的錯誤。 – magicianiam