c - 对象属性与指针之间的转换作为函数参数
问题描述
我在 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
是一个指针(指向 a Key
)。因此,要将这些传递给key_comp(Key a, Key b)
您需要取消引用它,从而将 a 转换Key*
为 a 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
.
推荐阅读
- httpclient - HttpClient 不返回所有标头
- c# - C# 通过 Z 数之间的较大距离拆分坐标数组
- react-native - 对象作为 React 子对象无效(关于 firebase)
- python - 递归以在 Python 中使用单个 like if else 打印前十个数字的总和
- amazon-web-services - 在 AWS-IoT 中使用 http 创建事物 api?
- c++ - 使用按引用传递的 C++ 中的奇怪行为?
- jquery - 数组删除\t\n。--NodeJS--
- javascript - Javascript滚动总是在底部
- sql - 有没有办法在查询后跟踪和继承数据访问规则
- postgresql - 使用 CMake 安装 libpq 依赖项