2016-03-26 36 views
0

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

1 Hata kaynağını azaltmak için hata ayıklayıcısını kullanın. 2. Burada sorununuzu yeniden üreten bir [MCVE]. –

+0

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

cevap

0

Segmentasyon Arıza yok hafızayı erişmeye çalışırken kaynaklanır. Bu, C/C++ için yeni olan insanlar için çok yaygın bir hatadır. Tüm göstericilerinizi iki kez kontrol edip, istediğiniz bilgilere (adres/değer) erişmeye çalıştığınızdan emin olun.

+0

Bu bir yorum olmalıydı. –

+0

Bunu çözdüm, henüz kurmamış olduğum bir yapıya erişmeye çalışıyordum ve böylece henüz var olmayan bir belleğe erişiyordum. Teşekkürler @ Koverman47 –

İlgili konular