我正在尝试在C中实现ADT二进制树,我想使用API,该函数的形式类似于foo(object,value)。到目前为止,我为int值编写了工作树,但是当我调用BinTree_insert函数时,必须使用运算符“&”来获取对象的地址。可以修改此功能以省略&吗?
typedef struct __bintree_node_t
{
int data;
struct __bintree_node_t* left;
struct __bintree_node_t* right;
}bintree_node_t;
static void __BinTree_insert(bintree_node_t** node, int value)
{
if(!(*node))
{
*node = __BinTree_newNode();
(*node)->data = value;
}
else if((*node)->data < value)
__BinTree_insert(&(*node)->left, value);
else if((*node)->data > value)
__BinTree_insert(&(*node)->right, value);
}
void BinTree_insert(bintree_node_t* node, int value)
{
//??????
}
int main(void)
{
bintree_node_t* root = 0;
BinTree_insert(root, 2); //sth like this
__BinTree_insert(&root, 1); //instead of this
}
答案 0 :(得分:1)
您有以下选择:
您可以代替返回新的指针,而不是将传递的指针修改为指针。但这意味着使用返回的值,这会使封装有些失败:
static void BinTree_insert(bintree_node_t* node, int value)
{
if (!node)
{
node = __BinTree_newNode();
node->data = value;
}
else if (node->data < value)
node->left = __BinTree_insert(node->left, value);
else if (node->data > value)
node->right = __BinTree_insert(node->right, value);
}
int main(void)
{
bintree_node_t* root = 0;
root = BinTree_insert(root, 2);
}
或者,如果您只想更改初始呼叫,则可以自己维护指针到指针:
int main(void)
{
bintree_node_t* root = 0;
bintree_node_t** rootPtr = 0;
__BinTree_insert(rootPtr, 2);
}
或者您可以定义一个进一步封装指针的类型,但是会增加更多的代码和内存分配。
不过,不确定要点是什么吗?
答案 1 :(得分:0)
您已经实现了insert()函数,以便它修改它的第一个参数。为此,必须通过指针传递根。如果按值(bintree_node_t*
)传递它,则BinTree_insert()
内根的更改不会反映在函数外部(尽管对根 node 的更改会反映出来)
例如,如果树为空(根等于NULL),则您的插入函数将创建一个新节点,并将根指针指向该节点;如果您想保留原始的根指针(将继续为NULL),则无法做到这一点。
您可以做的是让插入函数返回新的根目录。然后,您可以将旧根作为bintree_node_t*
传递(即按值)。