2017-06-16 11 views
-8

私はいくつかの助けが必要なCで行うべき練習があります。私は、それぞれnode%sum_of_previous_nodes == 0の値が格納されている番号のリストをチェックする再帰関数(checkModOfPrevSum())を書く必要があります。ボイド関数Cの再帰

各ノードについて、ノードの値、以前のノードの合計、およびnode_value%sum_of_previous_nodes == 0に応じて「はい」または「いいえ」の合計を出力する必要があります。印刷は逆の順序で行う必要があります。どのしばらくまたはループのために使用することはできません

void checkModOfPrevSum(struct list *node, int sum) {.........} 

私が使用する必要が関数がこれです。リストは以下のいずれかの場合

例、:(値5を持つノードが頭である)

5 2 3 6 1 7 4 

結果がでなければなりません:

4 [24] (YES) - 7 [17] (NO) - 1 [16] (YES) - 6 [10] (NO) - 3 [7] (NO) - 2 [5] (NO) - 5 [0] (YES) 

私はコードを書くことができますどのように?

+1

あなたは試みましたか? :-)もしそうなら、それを質問に加え、それが[mcve]であることを確認してください。 – George

+0

ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 StackOverflowは、デザイン、コーディング、リサーチまたはチュートリアルサービスではありません。 – Prune

+1

["誰かが私を助けることができますか?"有効なSOの質問ではありません)[https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question)。これは通常、あなたが必要とするものは、ローカルの家庭教師と30分、またはスタックオーバーフローではなくチュートリアルを歩くことを示唆しています。 – Prune

答えて

1

初心者はお互いに助けてください。

割り当てが私とあなたのような初心者のために行うことは容易ではありません。:)ここ

にいます。

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

struct node 
{ 
    int data; 
    struct node *next; 
}; 

void insert(struct node **head, const int a[], size_t n) 
{ 
    if (*head != NULL) head = &(*head)->next; 

    for (size_t i = 0; i < n; i++) 
    { 
     struct node *tmp = malloc(sizeof(struct node)); 
     tmp->data = a[i]; 
     tmp->next = *head; 
     *head = tmp; 
     head = &(*head)->next; 
    }   
}  

void checkModOfPrevSum(struct node *head, long long int sum) 
{ 
    if (head != NULL) 
    { 
     if (head->next != NULL) 
     {    
      checkModOfPrevSum(head->next, sum + head->data); 
      printf(" - "); 
     }    

     printf("%d [%lld] (%s)", head->data, sum, sum % head->data == 0 ? "YES" : "NO"); 
    }   
}  


int main(void) 
{ 
    struct node *head = NULL; 
    int a[] = { 5, 2, 3, 6, 1, 7, 4 }; 
    const size_t N = sizeof(a)/sizeof(*a); 

    insert(&head, a, N); 

    checkModOfPrevSum(head, 0); 

    return 0; 
} 

プログラムの出力は、リストの実装が完了していないもちろん

4 [24] (YES) - 7 [17] (NO) - 1 [16] (YES) - 6 [10] (NO) - 3 [7] (NO) - 2 [5] (NO) - 5 [0] (YES) 

です。あなたはそれをさらに発展させることができます。

+0

'if(* head!= NULL)head =&(* head) - > next;'これは 'while'ではありませんか?リニアスタイルは読みにくい:p。 – Stargateur

+0

@Stargateurなぜそれがしなければならないのですか?渡されたノードがNULLかNULLではないかどうかをチェックし、それに応じて頭を調整する文です。 –

+0

その目的は何ですか?私は、あなたが 'while'でない場合、この' if 'を追加する目標は何かを理解していません。このリストの1つ後ろに挿入しますか? – Stargateur