首页 > 解决方案 > 对象属性与指针之间的转换作为函数参数

问题描述

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

标签: carrayspointersmethods

解决方案


这是我能想到的最好的。我不清楚代码到底在做什么,但是混合使用指针和对象副本会让它有点偏离。

要考虑的关键是它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.


推荐阅读