2016-03-26 44 views
0

私は新しく作成したハフマンツリーを返す関数を作成しようとしていますが、この関数はリスト内の2つの最小頻度を見つけてそれらを削除し(remove_smallest)、新しいtreeNode(ルート)それをリストに再び(ハフマンツリーのスタイルで)入れ、リストに1つの要素が残るまでそれをすべて行います。私のプログラムは、remove_smallest関数の2回目の呼び出しの直後に行の周りでクラッシュするようです。 remove_smallest関数は、リスト内の最小のtreeNodeを返します。要素が1つ残るまで、treeNodeは継続します。どこが間違っていますか?何故私はセグメンテーションフォルトを得るのですか?私が言及したように、remove_smallestへの2回の呼び出し直後にクラッシュするようです。ポインタにセグメンテーションフォルトが発生するのはなぜですか?

私はランダムなメモリを指しているポインタを逆参照していますか?または何かに間違ったポインタを設定する?

何か助けていただければ幸いです。ありがとうございました。

コード:

typedef TreeNode* Element; 
typedef Frequency* TreeElement; 

struct TreeNode { 

    TreeElement data; //stores a pointer to the data in this tree node 
    TreeNode *left; //reference to the left child tree 
    TreeNode *right; //reference to the right child tree 

}; 

struct ListNode { 
    Element data; // stores a pointer to data in node 
    ListNode *next; // reference to next node in list 
}; 

struct List { 
    ListNode *head; // reference to the first node in the list 
    int numElements; // the number of nodes in the list 
}; 

struct HuffmanTree { 
    TreeNode *root; 
}; 

struct FrequencyList { 
    List *freqs; 
}; 

struct Frequency { 
    char data; // the character being represented 
    int count; // the number of occurrences of the character 
}; 

    HuffmanTree *createHuffmanTree(FrequencyList *frequencies) { 

    List * newList = new List; 
    newList = frequencies->freqs; 

    TreeNode * newTree1; 
    TreeNode * newTree2; 
    TreeNode * root = new TreeNode; 


     while (frequencies->freqs->numElements != 1) { 

      newTree1 = remove_smallest(frequencies); // removes and returns smallest treeNode from list 
      newTree2 = remove_smallest(frequencies); 
      root->data->count = newTree1->data->count + newTree2->data->count; 
      root->left = newTree1; 
      root->right = newTree2; 

      insert(newList, root); // inserts back into list 

     } 

     HuffmanTree * newHuffmanTree = new HuffmanTree; 
     newHuffmanTree->root = root; 

    return newHuffmanTree; 

} 
+1

1stデバッガを使用して、エラーの原因を絞り込みます。 2番目に[MCVE]を投稿して問題を再現してください。 –

+0

おそらく、 'remove_smallest'や周波数構造の構築方法や' insert'に問題があります。または、他の何か。あなたが投稿した唯一の明白な問題は 'newList'メモリリークです。 – molbdnilo

答えて

0

セグメンテーションフォールトが存在しないメモリにアクセスしようとによって引き起こされます。これは、C/C++を初めて使用する人にとっては非常に一般的なエラーです。私はすべてのあなたのポインタを確認し、あなたが意図した情報(アドレス/値)にアクセスしようとしていることを確認します。

+0

これはコメントだったはずです。 –

+0

私はそれを理解しました、私はまだ確立していない構造体にアクセスしようとしていたので、まだ存在していなかったメモリにアクセスしようとしていました。ありがとう@ Koverman47 –

関連する問題