2015-10-15 29 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