我对结构指针的return值感到困惑。
我写了一篇AVL Tree。这是我的头文件片段-

typedef struct AVLNode {
    struct AVLNode  *left,
                    *right;
    int value,
        height;
} AVLNode;

typedef struct AVLNode *AVLTree;
AVLNode *delet(int value, AVLTree t);

这是我的delet()main()-
AVLNode *delet(int value, AVLTree t)
{
    if (t == NULL) {
        printf("Node not found\n");
        return t;
    }
    else if (value == t->value) {
        .....
        return t;
    }
    else if (value < t->value) {
        if (t->left != NULL) {
            t->left = delet(value, t->left);
        }
        if (height(t->left) - height(t->right) == 2) {
            if (t->value < t->left->value)
                    t = rotateR(t);
            else
                    t = rotateLR(t);
        }
        .....
        return t;
    }
    else if (value > t->value) {
        if (t->right != NULL) {
            t->right = delet(value, t->right);
        }
        .....
        return t;
    }
}

void main()
{
    AVLTree t = NULL;
    .....
    t = delet(4, t);    /* works fine */
    delet(4, t);        /* gives improper results */
    .....
}

这里,我返回t(它是AVLNode *类型)。虽然我意识到这在递归调用中是必不可少的,但我不明白的是-
当我从delet()调用t = delet(4, t)时,它会给出正确的结果,而仅仅调用main()会给出错误的结果。
如果我在delet(4, t)中传递指针(delet(t)t),为什么需要再次将其收集到指针中?

最佳答案

这是因为您已按值传递了AVLTree t。将t的地址传递给delet,然后对其进行修改。
现在您只修改您在AVLTree t函数中声明的delet的本地副本:
AVLNode *delet(int value, AVLTree t)
尝试将函数声明为AVLNode *delet(int value, AVLTree *p_t),调用将为delet(4, &t);
编辑:(在OP的评论)
当需要修改函数内部的值时:

void swap(int a, int b)
{
  int t;
  t = a;
  a = b;
  b = t;
}

这不起作用,因为您需要修改ab,它们是您向函数传递的“副本”。
类似地,在您的情况下,您需要修改指针所持有的地址,即指针本身,因此“指针的地址”需要在这里传递,而不是指针所持有地址的副本。

10-06 00:46