我想用C来写一个树复制功能:指针的指针不树复制算法工作
void tree_copy(treenode *source, treenode **dest)
{
treenode *newtree; //the new tree will be created using this as root
treenode **bkup = &newtree; //pointer to pointer, to keep backup of head of newtree
/*
Code to create new tree
Traverses using *newtree
And leaves *newtree pointing at last node created
But *bkup still contains the address of the head node, right?
*/
*dest = *bkup; //assign the new tree created to the parameter
}
//I'm trying to invoke it like this:
int main(void)
{
treenode *t1, *t2;
create_tree(&t1); //tested, already written function to create a tree. No bugs.
tree_copy(t1, &t2);
preorder(t2); //tested, already written function for preorder traversal.
}
应该包含新创建的树的根(T2)的节点仍然NULL在此操作之后。 这是怎么回事?在我的逻辑中备份新树的起始节点有什么问题?
任何帮助将不胜感激。
“所以bkup不包含副本的存储在newtree中的指针,它包含newtree变量的地址,存储并不是真的有用,因为它不会改变。“ 的确如此,但如果您在代码中注意到,在返回的时候,我**取消了**'bkup'。所以它现在应该提供原始'newtree'节点的地址,对吧?如果有什么我不见了,你能编辑你的答案来显示图表吗? –
'bkup'包含'newtree'的地址,所以解引用它会产生该地址处的memeory的内容,即'newtree'变量的内容。 '* bkup'只意味着“在'newtree'变量中查看那里。它会给你这个变量的当前内容,而不是它的一些旧版本。如果你给'newtree'分配了一些新内容,那么它的内存位置的内容就会改变,如果你用'* bkup'再次查看内存位置,你会看到新的内容。 'bkup ==&newtree',所以'* bkup == *&newtree'('== newtree') – sth
啊,明白了。感谢您的回答和解释。 –