繁体   English   中英

在C中返回指向结构的指针

[英]Returning a pointer to a struct in C

我对指向结构指针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()调用中,我不明白的是-

  • 当我从main()调用t = delet(4, t) ,它会给我正确的结果,而仅调用delet(4, t)会给出错误的结果。
  • 如果我在AVLNode * delet(t)传递了一个指针( tAVLNode * ),为什么还要再次将其收集到指针中?

这是因为您已“按值”传递了AVLTree t 通过地址tdelet然后修改它。

现在你只是修改的本地副本AVLTree t ,你在声明delet功能:
AVLNode *delet(int value, AVLTree t)

尝试将函数声明为AVLNode *delet(int value, AVLTree *p_t) ,然后调用将为AVLNode *delet(int value, AVLTree *p_t) delet(4, &t);

编辑:(在 AT OP的评论)

当您需要在函数内部修改值时:

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

这是行不通的,因为您需要修改粘贴到函数中的“副本”的ab

同样,在您的情况下,您需要修改指针AVLTree t保存的地址,即指针本身,因此需要在此处传递“指针的地址”,而不是指针所保存的地址的副本。

你需要这个

 AVLNode *delet(int value, AVLTree* t)

AVLTree t;
 delet(4,&t);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM