C链接后的节点功能缺失

时间:2018-06-22 06:45:51

标签: c huffman-code

根据文本文件制作霍夫曼树。我是霍夫曼概念的新手,所以我拥有的大多数代码都是凌乱的。问题在于,在创建底部节点并将它们链接为一棵树之后,它们最终会擦除其中的数据。我不确定是什么原因导致数据丢失。

主要问题似乎在“ new_node ”和“ makeTree ”函数中。

chmod 777 /home

作为霍夫曼树,头节点携带字符的总频率,这意味着它采用子节点的2个频率(左和右)。这里的问题是头节点确实存储了总频率,但是指向两个子节点的指针为NULL或指向疯狂的方向。

谢谢。

2 个答案:

答案 0 :(得分:0)

我想您的node* new_node(char data, int freq, node* son1, node* son2)可以正常工作。 node* makeTree中存在一个谬论。

我将尝试举例说明。假设输入文件中包含文本 aabbccd

void strtocode(char * str, int length)的结果将是非常初始的节点,其字符,字符频率以及指向null的左右指针。

|a, 2, null, null|, |b, 2, null, null|, |c, 2, null, null|, |d, 1, null, null|, |'\n', 1, null, null|

现在sort_codes()根据节点数进行排序。

|'\n', 1, null, null|, |d, 1, null, null|, |a, 2, null, null|, |b, 1, null, null|, |c, 2, null, null|

现在是node* makeTree()

此时的nodeCount = 5。您创建了带有已排序数据的节点数组。让我们分析一下do while内部的第一个for循环。 for a value i = 0 node1拥有这个|'\n', 1, null, null|,然后for a value i = 1 node2拥有这个|d, 1, null, null|。那么for a value i = 2就有node1node2指向有效节点。现在创建了新节点,您正在将其分配给nodes[2],您在指向nodes[2]的{​​{1}}上丢失了数据,您不再拥有该数据。为什么? 。

为什么第一个for循环只运行到nodeCount?最终的树将在(nodeCount *(nodeCount + 1))/ 2附近有节点。再次为什么?也可能有其他问题。我现在有这些。

答案 1 :(得分:0)

所以看来我搞砸了验证,几乎... 像

if(son1 <= son2){
    //something
}
if(son2 > son1){
    //something else
}

几乎相同...