指向指针的指针在树复制算法中不起作用

时间:2015-10-15 05:10:30

标签: c pointers data-structures

我试图在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。 为什么会这样?我的逻辑在备份新树的起始节点时出了什么问题?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

如果要保存初始值newtree的副本,则必须在初始化后将其复制到newtree*变量:

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

答案 1 :(得分: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是一个未初始化的指针,您正在使用未初始化变量的地址,这将导致未定义的行为