Yeni oluşturulmuş bir Huffman ağacını döndüren bir işlev yazmaya çalışıyorum; bu işlev, bir listedeki en küçük iki frekansı bulur, sonra bunları kaldırır (remove_smallest) ve sonra onları yeni bir treeNode (root) ve insert'in çocukları yapar. Listeye tekrar (Huffman ağaçları tarzında) ve listede 1 öğe kalmayıncaya kadar her şeyi yapıyor. Programım, remove_smallest işlevine ikinci çağrıdan hemen sonra satırın etrafında çöküyor gibi görünüyor. Remove_smallest işlevi listedeki en küçük treeNode değerini döndürür. Bir öğe kalmayıncaya kadar devam etmelidir. Nerede yanlış gidiyorum? Neden herhangi bir segmentasyon hatası alıyorum? Söylediğim gibi, iki çağrıyı kaldırmanın hemen ardından kilitleniyor gibi görünüyor.İşaretçilerimde neden bölümleme hatası alıyorum?
Rastgele bellek işaret eden bir işaretçi kaldırılıyor muyum? veya bir şeye yanlış bir işaretçi mi ayarlıyorsunuz?
Herhangi bir yardım için teşekkür ederiz. Teşekkür ederim.
Kodu:
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 Hata kaynağını azaltmak için hata ayıklayıcısını kullanın. 2. Burada sorununuzu yeniden üreten bir [MCVE]. –
Muhtemelen 'remove_smallest' ile veya frekans yapısının nasıl oluşturulduğuyla veya 'insert' ile ilgili bir sorun. Veya başka bir şey. Gönderdiğiniz şeyle ilgili en belirgin sorun 'newList' bellek sızıntısıdır. – molbdnilo