使用指向结构“x”的结构“x”,创建指向结构“y”的结构“y”

时间:2014-12-14 21:07:18

标签: c pointers struct relationship

假设我有B +树节点结构如下:

typedef struct node 
{
    struct node * pointers; //pointers to child nodes
    int * keys; //keys in this node
    struct node * parent; //pointer to parent node
    bool is_leaf; //is the node a leaf
    int num_keys; //number of keys in this node
} node; 

一个名为index的新结构,节点结构为:

typedef struct index
{
    int m; //number of keys in this index
    bool flag; //does the node POINTS to a leaf
    struct index * parent_index; //pointer to parent index
    int * k; //keys in this index
    struct index * p; //pointers to child indexes
} index;

假设我按此顺序输入简单键2,3和1,以启动和实现B +树结构。我们现在制作了一个简单的B +树,它代表了我们在2,3和1键之​​间的关系。现在我想将这种关系复制到一个新的结构,即index。我可以导航到B +树的每个node,并int node->num_keys转到int index->mbool node->is_leaf有助于实现bool index->flag一些思考和int * node->keys转到int * index->k。如你所见,问题从剩下的两个指针开始...... 我怎么可能得到一个复杂的结构,它有指针创建它们之间的关系,并将相同的关系复制到具有相同行为的新复杂结构?

2 个答案:

答案 0 :(得分:2)

您需要一个克隆数据结构的递归函数。一般的想法是每次调用递归函数都复制复杂结构的一部分,但调用函数来对每个“子”对象执行操作。特殊情况是调用的函数本身。对于您的示例,它可能类似于:

node * copy_node(node *n) {
    node *r = malloc(sizeof(*n));
    r->num_keys = n->num_keys;
    r->is_leaf = n->is_leaf;
    r->keys = malloc(sizeof(int)*r->num_keys);
    r->pointers = malloc(sizeof(node *)*r->num_keys);
    for (int i=0; i<r->num_keys; i++) {
        r->keys[i] = n->keys[i];
        r->pointers[i] = copy_node(n->pointers[i]);
        r->pointers[i]->parent = r;
    }
    return r;
}

可以构建类似的函数来克隆index

答案 1 :(得分:0)

我要建议的是非常狡猾但是,由于这些结构的大小完全相同且所有成员都相同,因此可以通过简单的重新排序来完成这个深度克隆结构中的成员。 只要您对每个节点的成员进行混洗以匹配索引指针所期望的顺序,任何node指针值都是有效的index指针值。

这无疑是非常糟糕的做法,但是如果你买不起那些额外的内存,这是一个选择。当然,此选项不易维护,因为index定义中的更改会破坏该过程,除非对node定义进行了相应的更改。