2015-10-15 30 views
0

我想用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在此操作之后。 这是怎么回事?在我的逻辑中备份新树的起始节点有什么问题?

任何帮助将不胜感激。

回答

1
treenode *newtree; 
treenode **bkup = &newtree; 

bkup包含newtree变量的地址的地址。变量newtree将包含地址treenode

因此bkup不包含存储在newtree中的指针的副本,它包含newtree变量的地址。存储这不是很有用,因为它不会改变。无论分配给它什么内容,newtree变量都将保留在相同的位置。

如果你想保存的newtree初始值的副本,你必须复制到newtree*变量,一旦它得到了初始化:

treenode *root = newtree; 
... 
*dest = root; 
+0

“所以bkup不包含副本的存储在newtree中的指针,它包含newtree变量的地址,存储并不是真的有用,因为它不会改变。“ 的确如此,但如果您在代码中注意到,在返回的时候,我**取消了**'bkup'。所以它现在应该提供原始'newtree'节点的地址,对吧?如果有什么我不见了,你能编辑你的答案来显示图表吗? –

+0

'bkup'包含'newtree'的地址,所以解引用它会产生该地址处的memeory的内容,即'newtree'变量的内容。 '* bkup'只意味着“在'newtree'变量中查看那里。它会给你这个变量的当前内容,而不是它的一些旧版本。如果你给'newtree'分配了一些新内容,那么它的内存位置的内容就会改变,如果你用'* bkup'再次查看内存位置,你会看到新的内容。 'bkup ==&newtree',所以'* bkup == *&newtree'('== newtree') – sth

+0

啊,明白了。感谢您的回答和解释。 –

0
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 // 

newtree是一个指针,它是未初始化的并且使用的是未初始化变量的,这将导致不确定的行为

+0

谢谢您的回答,但我不明白这一点。我在'bkup'中存储了'newtree'的**地址**。现在我开始创建一个以'newtree'为头的新树。所以现在'* bkup'应该包含新树的头部,对吧? –

+0

我不认为采取未初始化变量的地址是未定义的行为。见例如http://stackoverflow.com/questions/28587022/is-it-undefined-behavior-to-take-the-address-of-an-uninitialized-pointer – sth