根据文本文件制作霍夫曼树。我是霍夫曼概念的新手,所以我拥有的大多数代码都是凌乱的。问题在于,在创建底部节点并将它们链接为一棵树之后,它们最终会擦除其中的数据。我不确定是什么原因导致数据丢失。
主要问题似乎在“ new_node ”和“ makeTree ”函数中。
chmod 777 /home
作为霍夫曼树,头节点携带字符的总频率,这意味着它采用子节点的2个频率(左和右)。这里的问题是头节点确实存储了总频率,但是指向两个子节点的指针为NULL或指向疯狂的方向。
谢谢。
答案 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
就有node1
和node2
指向有效节点。现在创建了新节点,您正在将其分配给nodes[2]
,您在指向nodes[2]
的{{1}}上丢失了数据,您不再拥有该数据。为什么?
。
为什么第一个for循环只运行到nodeCount?最终的树将在(nodeCount *(nodeCount + 1))/ 2附近有节点。再次为什么?也可能有其他问题。我现在有这些。
答案 1 :(得分:0)
所以看来我搞砸了验证,几乎... 像
if(son1 <= son2){
//something
}
if(son2 > son1){
//something else
}
几乎相同...