假设我有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->m
,bool node->is_leaf
有助于实现bool index->flag
一些思考和int * node->keys
转到int * index->k
。如你所见,问题从剩下的两个指针开始......
我怎么可能得到一个复杂的结构,它有指针创建它们之间的关系,并将相同的关系复制到具有相同行为的新复杂结构?
答案 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
定义进行了相应的更改。