2016-11-16 1 views
0

以下の2つの構造体があります。 huffmanTree = tempNodeを設定した後、huffmanTreeの右と左の内部ポインタはNULLです。しかし、その前にも値は有効ですが、2つの構造体を互いに等しく設定した後、値は消えました。私は間違って何をしていますか?2つの構造体が互いに等しく設定された後にポインタがNULLになる

huffmanTree structを作成して、データで初期化したいだけです。次にを作成し、HuffmanTree *lefthuffmanTreeを指し、HuffmanTree *rightが新しいデータを指していることを示します。私はhuffmanTreeからデータをプリントアウトするとき、それは

// Leaf node 
typedef struct HuffmanLeaf { 
private: 
    char data; 
    int count; 
public: 
    HuffmanLeaf() { 

    } 

    void setData(char data) { 
     this->data = data; 
    } 

    void setCount(int count) { 
     this->count = count; 
    } 

    char getData() { 
     return this->data; 
    } 

    int getCount() { 
     return this->count; 
    } 
}HuffmanLeaf; 


// Huffman tree 
typedef struct HuffmanTree { 
    HuffmanTree *right; 
    HuffmanTree *left; 
    HuffmanLeaf huffmanLeaf; 
} HuffmanTree; 

int main() { 
    /* huffmanLeaf[] was defined and initialized 
    . 
    . 
    . 
    . 
    */ 

    // Take the first two smallest and so on 
    HuffmanTree huffmanTree; 
    HuffmanTree tempNode; 

    // Allocate memory for internal struct 
    huffmanTree.left = new (HuffmanTree); 
    huffmanTree.right = new (HuffmanTree); 
    tempNode.left = new (HuffmanTree); 
    tempNode.right = new (HuffmanTree); 

    // Two character with least frequency. Create a new Tree 
    huffmanTree.right->huffmanLeaf = huffmanLeaf[0]; 
    huffmanTree.left->huffmanLeaf = huffmanLeaf[1]; 


    // Next character 
    tempNode.left = &huffmanTree; // have node left point to huffmanTree 
    tempNode.right->huffmanLeaf = huffmanLeaf[2]; // new data on node right 

    /* Data is still here for tempNode */ 
    cout << tempNode.left->left->huffmanLeaf.getData() << endl; 

    /* Error occured after this */ 
    huffmanTree = tempNode; 

    // Value is NULL 
    cout << huffmanTree.left->left->huffmanLeaf.getData() << endl; // Value is NULL 
} 
+2

HuffmanTreeのデストラクターの内容とコピーコンストラクタ/代入演算子の内容を表示できますか?速い修正は、途中でhuffmanTreeとtempNodeのポインタを作ることです。 – dseifert

+0

それは働いた。なぜか教えてくれますか? – tuyenle

答えて

2

NULLだったあなたはtempNode.left = &huffmanTree;を行い、そのhuffmanTree = tempNode;後。が

冗談はさておき、割り当ての前に...うまくいかなかった何かあれば、それは奇跡のようになります。

huffmanTree is { new, new } 
tempNode is { &huffmanTree, new } 

割り当てた後、huffmanTree is { &huffmanTree, new }

は、だからあなたのポインタジャンプは基本的に次のとおりです。

huffmanTree->huffmanTree->huffmanTree->huffmanLeaf.GetData(); 

「huffmanTree」に対してhuffmanLeafを定義していないため、valあなたがコンストラクタ内でdataを初期化していないので、デフォルトでは未定義の動作です。

関連する問題