2017-02-01 5 views
1

私は、各ノードに対して3つの可能な子を持つ単純なツリーを作成する単純なCファイルを持っています。私の目標は、特定のノード内のデータとそのすべての子ノードのデータの合計を見つけることです。私は再帰でこれをやっていますが、それは一度しか動作しませんが、2回連続して実行されると、古いメソッドの値が残っています。それが再び呼び出されたときには、クラスの先頭にあるように、2つのデータ値が0にリセットされるのではなく、追加されます。なぜこれが起こっているのか分かりません。ここにコードがあります。ファイル変数はCの別の関数間で持続します

struct N *mknode(struct N *xp, struct N *yp, struct N *zp, long n) 
{ 
struct N *p = malloc(sizeof(struct N)); 
p->x = xp; 
p->y = yp; 
p->z = zp; 
p->data = n; 
return p; 
} 

int main(int argc, const char *argv[]) 
{ 
struct N *p1, *p2, *p3, *p4, *p5, *p6; 

// construct a tree for testing: 

p1 = mknode(NULL, NULL, NULL, 1); 
p2 = mknode(NULL, NULL, NULL, 10); 
p3 = mknode(NULL, NULL, NULL, 100); 
p4 = mknode(p1, p2, p3, 3000); 
p1 = mknode(NULL, NULL, NULL, 1); 
p2 = mknode(NULL, NULL, NULL, 10); 
p3 = mknode(NULL, NULL, NULL, 100); 
p5 = mknode(p1, p2, p3, 4000); 
p5 = mknode(p4, p5, NULL, 50000); 
p6 = mknode(p5, NULL, NULL, 100000); 

// to test only on trees, remove the following 
// assignments that turn the tree into a graph 
//p1->x = p5; 
//p2->y = p4; 
//p2->z = p2; 
//p6->y = p5; 
//p6->z = p6; 

long s = sum(p6); 
long x = sum(p6); 

sとxは何らかの理由で同じ値を持つ必要がありますが、xは2倍です。 これは、別のクラスのファンクションコードです。

long data = 0; 

long sum(struct N *p){ 
printf("%ld\n", data); 
if (p != NULL){ 
    sum(p->x); 
    sum(p->y); 
    sum(p->z); 
    return data += p->data; 
} 
return 0; 
} 

ここは、ヘッダーファイルの初期構造体です。

struct N { 
struct N *x; 
struct N *y; 
struct N *z; 
long data; 
}; 
+1

の戻り値を印刷 '長いデータ= 0;'それは初期化子です。プログラムの起動時に一度だけ値を設定します。それを関数に移して、関数が実行されるたびにローカル変数として初期化させます。 – kaylum

+0

Cにはクラスがありません。 –

+0

Cには「クラス」や「メソッド」はありません。あなたはおそらく "ファイル"と "機能"を意味します。 – kaylum

答えて

1

sumグローバル変数dataに追加されます。 mainからの各コール後、決してゼロにリセットされません。

summainに呼び出すたびに、data = 0;を追加します。いっそ、sumとして書き換える:

long 
sum(struct N *p) 
{ 
    long total = 0; 
    if (p != NULL){ 
     total += sum(p->x); 
     total += sum(p->y); 
     total += sum(p->z); 
     total += p->data; 
    } 
    return total; 
} 

はその後、ちょうどsum

+0

ソリューションをご利用いただき、ありがとうございました。 –

関連する問題