我有一个直接的c文件,它创建一个简单的树,每个节点有3个可能的子节点。我的目标是找到给定节点及其所有子节点中的数据总和。我用递归做这个,它有效一次,但是当它连续运行两次时,旧方法的值仍然存在,我不知道为什么。再次调用它时的意思是添加两个数据值而不是像我在类顶部那样重置为0。不知道为什么会这样。这是代码。
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是double s。 这是一个单独的类中的功能代码。
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 :(得分:1)
sum
添加到全局变量data
。在每次来自main
之后,它永远不会重置为零。
在sum
的每次main
来电之间,添加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