对象属性与指针之间的转换作为函数参数

标签 c arrays pointers methods

我在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/

相关文章:

c++ - 是否存在 fseek/ftell 给出错误文件大小的情况?

c - 是否可以更改用 const 限定符分配的变量的值

c - 在执行 scanf 之前 printf 如何被刷新?

可以通过返回指向结构的指针来改进此代码吗?

java - 如何将用户输入保存在数组中?

javascript - 如何为动态生成的表编写实时搜索功能?

javascript - 操作两个单独数组中的数组键值

将 **array + a 更改为 *array[a]

c - 如何将 void* pointer1 分配给 void* pointer2?面临一些问题

c - 遗传算法实现中的奇怪事件