[英]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)
传递了一个指针( t
是AVLNode *
),为什么还要再次将其收集到指针中? 这是因为您已“按值”传递了AVLTree t
。 通过地址t
到delet
然后修改它。
现在你只是修改的本地副本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;
}
这是行不通的,因为您需要修改粘贴到函数中的“副本”的a
和b
。
同样,在您的情况下,您需要修改指针AVLTree t
保存的地址,即指针本身,因此需要在此处传递“指针的地址”,而不是指针所保存的地址的副本。
你需要这个
AVLNode *delet(int value, AVLTree* t)
AVLTree t;
delet(4,&t);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.