我对指向结构的指针的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
是AVLNode *
),为什么我需要再次在指针中收集它?答案 0 :(得分:1)
这是因为您已通过值“AVLTree t
”。将t
的地址传递给delet
,然后进行修改。
现在您只修改在AVLTree t
函数中声明的delet
的本地副本:
AVLNode *delet(int value, AVLTree 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;
}
这不起作用,因为您需要修改a
和b
,其“副本”是您的功能。
同样在你的情况下,你需要修改指针AVLTree t
所持有的地址,即指针本身,因此“指针的地址”需要在这里传递,而不是指针所拥有的地址副本。
答案 1 :(得分:1)
你需要这个
AVLNode *delet(int value, AVLTree* t)
AVLTree t;
delet(4,&t);