С союз и структура вопроса - PullRequest
2 голосов
/ 19 февраля 2011

У меня есть древовидная структура. Узлы будут иметь тип конечного узла и тип внутреннего узла, поэтому я определил эти структуры, чтобы внутренний узел мог указывать либо на внутренние узлы, либо на конечные узлы. Однако у меня возникают проблемы с доступом к дочерним указателям, как я могу это сделать, ведь мой код вообще имеет смысл?

typedef struct leaf_node_t {
    int type;
    int key;
    int *data_ptr[2]; //This will point to real data.
} leaf_node_t;

typedef struct internal_node_t {
    int type;
    int key;
    typedef union{
        struct internal_node_t* iptrs[2];
        leaf_node_t* lptrs[2];
    } node_ptr;
} internal_node_t;

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Попробуйте это:

typedef struct leaf_node_t{
       int key;
       int *data_ptr[2];//this will point to real data
} leaf_node_t;

struct internal_node_t;

typedef union{
    struct internal_node_t* iptrs[2];
    leaf_node_t* lptrs[2];
} node_ptr;

typedef struct internal_node_t{
       int key;
       node_ptr node;
} internal_node_t;

int main()
{
    internal_node_t inode;

    leaf_node_t* leaf_node = inode.node.lptrs[0];
    return 0;
}

В качестве альтернативы, если вам на самом деле не нужно использовать определение типа объединения где-либо еще:

typedef struct leaf_node_t{
       int key;
       int *data_ptr[2];//this will point to real data
}leaf_node_t;

typedef struct internal_node_t{
       int key;
       union{
             struct internal_node_t* iptrs[2];
             leaf_node_t* lptrs[2];
       }node_ptr;
}internal_node_t;
int main()
{
    internal_node_t inode;

    leaf_node_t* leaf_node = inode.node_ptr.lptrs[0];
    return 0;
}
2 голосов
/ 19 февраля 2011

typedef для node_ptr на самом деле не добавляет поле в свою структуру.Далее сначала добавляются поля, а затем добавляется typedef.Другое изменение, которое я сделал, заключалось в том, чтобы объединение представляло один указатель, оставляя его структуре, которая использует его, чтобы решить, сколько указателей он хочет.

typedef struct internal_node_t{
   int type;
   int key;
   union node_ptr_t {
         struct internal_node_t* iptr;
         leaf_node_t* lptr;
   } node_ptr[2];
}internal_node_t;

typedef union node_ptr_t node_ptr_t;
1 голос
/ 19 февраля 2011

Вы должны добавить флаг в internal_node, чтобы знать, что такое node_ptr, если это internal_node_t или leaf_node_t. Вероятно, int isInternal [2]; (после ключа и перед typedef). если это 0, то это внутреннее, если это 1, то это leaf_node_t. Язык C не имеет typeof или GetType, чтобы знать, на какой тип памяти указывает указатель (а в C ++ он есть, только если вы компилируете с активированной опцией RTTI)

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