私は新しく作成したハフマンツリーを返す関数を作成しようとしていますが、この関数はリスト内の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;
}
1stデバッガを使用して、エラーの原因を絞り込みます。 2番目に[MCVE]を投稿して問題を再現してください。 –
おそらく、 'remove_smallest'や周波数構造の構築方法や' insert'に問題があります。または、他の何か。あなたが投稿した唯一の明白な問題は 'newList'メモリリークです。 – molbdnilo