私は、各ノードに対して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;
};
の戻り値を印刷 '長いデータ= 0;'それは初期化子です。プログラムの起動時に一度だけ値を設定します。それを関数に移して、関数が実行されるたびにローカル変数として初期化させます。 – kaylum
Cにはクラスがありません。 –
Cには「クラス」や「メソッド」はありません。あなたはおそらく "ファイル"と "機能"を意味します。 – kaylum