Преобразование атрибутов объектов в указатели и из них в качестве аргумента функции - PullRequest
0 голосов
/ 12 ноября 2018

Моя функция в c содержит узел объектов с двумя атрибутами Key * - указатель на ключевой объект и данные int. Сигнатура метода - key_comp (ключ, ключ), для которого требуется два ключа, однако объект узла содержит указатель на ключ. Я попытался использовать 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)

1 Ответ

0 голосов
/ 12 ноября 2018

Это лучшее, что я могу придумать. Мне не совсем ясно, что именно делает код, но наличие комбинации указателей и копий объектов немного сбивает его с толку.

Ключевым моментом, который необходимо учитывать, является то, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...