Qsort与霍夫曼树

时间:2015-12-09 18:15:51

标签: c tree binary-tree huffman-code qsort

我有一个问题,我必须建立一个霍夫曼树,我理解问题背后的概念,我知道如何做到这一点。但是,我发现我的代码出错的原因是我的排序功能。我想在每次将新节点输入列表时对列表进行排序。我有一个结构,在其中我有频率,我已经制作了一个字符存储在文件中的结构数组。

我的问题在于创建节点,创建一个新节点并指向数组中的两个字符。但是,当我对此列表进行排序时,指针会更改为其他字符。每一步都会发生这种情况,并导致它完全错误。

我在主要的qsort电话是这样的:

qsort(list, n, sizeof(Node), intcompare);

我的intcompare函数是这样的:

int intcompare(const void *a, const void *b)
{
int freq1 = ((Node*)a)->frequency;
int freq2 = ((Node*)b)->frequency;

   if (freq1 == freq2){
      return 0;
   }
   else if (freq1 < freq2){
      return 1;
   }
   else{
      return -1;
   }

}

我的结构是这样的:

typedef struct node{
   char character;
   int frequency;
   struct node *left;
   struct node *right;
}Node;

每次调用qsort时,我的列表都会按频率正确排序。 为什么这会改变我的struct中的指针所指向的位置? 在此先感谢!!

1 个答案:

答案 0 :(得分:1)

qsort移动数组中的结构。因此,如果存在指向数组中索引3处的字符left的{​​{1}}指针,并且Xqsort移动到索引16,那么X指针不再指向left。它将指向放在索引3处的任何X。长话短说,您需要在每次排序后重新计算所有qsortleft指针。