我在c中的函数包含对象节点,有两个属性Key*(指向关键对象的指针)和int数据。方法的签名是 key_comp(key, key),它需要两个键,但是节点对象包含一个指向键的指针。我尝试过使用 node->key 和 (Node).key 但两者都不能作为此方法的参数,您将如何将键指针转换为在方法中使用的键?
typedef struct
{
Node tree_nodes;
unsigned char *is_free;
int size;
} BStree_struct;
typedef BStree_struct BStree;
void insert_helper(int i, BStree bst, Node node){
if (i>= (*bst).size){
printf("Out of the range of the tree. \n");
return;
}
if ((*bst).is_free[i]==1){
(*bst).tree_nodes[i] = node;
(*bst).is_free[i] = 0;
}else if (key_comp(bst->tree_nodes[i].key, node.key) >0){
insert_helper(2*i,bst,node);
}else if (key_comp(bst->tree_nodes[i].key, node.key) <0){
insert_helper(2*i+1, bst, node);
}
}
typedef struct {char *name; int id;} Key;
typedef struct {Key *key; int data;} Node;
Key *key_construct(char *in_name, int in_id);
int key_comp(Key key1, Key key2);
void print_key(Key *key);
void print_node(Node node);
typedef struct {Node *tree_nodes; unsigned char *is_free;
int size;} BStree_struct;
typedef BStree_struct* BStree;
BStree bstree_ini(int size);
void bstree_insert(BStree bst, Key *key, int data);
void bstree_traversal(BStree bst);
void bstree_free(BStree bst)
最佳答案
这是我能想到的最好的办法了。我不清楚代码到底在做什么,但是混合使用指针和对象副本会让它有点困惑。
要考虑的关键是 Node.key
是一个指针(指向 Key
)。因此,要将它们传递给 key_comp(Key a, Key b)
,您需要取消引用它,从而将 Key*
转换为 Key
.
void insert_helper(int i, BStree bst, Node node)
{
if (i >= bst.size)
{
printf("Out of the range of the tree. \n");
return;
}
if (bst.is_free[i] == 1)
{
bst.tree_nodes[i] = node;
bst.is_free[i] = 0;
}
else if (key_comp(*(bst.tree_nodes[i].key), *(node.key)) > 0)
{
insert_helper(2*i, bst, node);
}
else if (key_comp(*(bst.tree_nodes[i].key), *(node.key)) < 0)
{
insert_helper(2*i+1, bst, node);
}
}
如果是我的代码,我会更改 key_comp()
以获取一对指向 Key
的指针。
关于对象属性与指针之间的转换作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53256011/