【问题标题】:Qsort with Huffman tree带有霍夫曼树的 Qsort
【发布时间】:2015-12-09 18:15:50
【问题描述】:

我有一个问题,我必须构建一棵 Huffman 树,我了解问题背后的概念并且知道如何去做。但是,我发现我的代码出错的原因与我的排序功能有关。每次在列表中输入新节点时,我都想对列表进行排序。我有一个结构,其中我有频率,我创建了一个结构数组,这些结构从文件中存储了字符。

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

我在 main 中的 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 时,我的列表都会按频率正确排序。 为什么这会改变我的结构中的指针指向的位置? 提前致谢!!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答!这很有意义,当我创建一个有 2 个叶子的节点时,我应该从列表中删除这些叶子,这样它们就不会再次使用。我通过将它们的频率设置为 0 来做到这一点,然后只考虑频率 > 0 的那些。这似乎是一种不好的方法。
    • 或者,可以创建一个指向Nodes 的指针数组,然后对 that 进行排序,而不是对 Node 数组进行排序。
    • 谢谢约翰,我只是在想同样的事情,创建 2 个数组并保持一个静态 :)。
    • 另一种选择是根本不排序。该算法要求您在每个步骤中找到两个最低频率。这可以通过一次通过阵列来完成,跟踪所看到的两个最低频率。这实际上比对数组进行排序要快。
    • 我明白你的意思,但我必须将新创建的节点插入到列表的正确位置。我被告知要使用插入排序,但我以前从未使用过它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多