【发布时间】:2014-06-25 04:15:59
【问题描述】:
我的程序涉及将树列表组合在一个队列中,我的程序完美编译并且适用于大约一半的代码,然后向我抛出此错误。我已经把它缩小到涉及我的freeTree以及我如何在encodefile中调用它,对于一些背景故事,这是一个基于文本文件中字符频率的编码器,所以如果有一个包含5个不同字符的文本文件,那么这段代码将从队列中的 5 个不同节点开始。队列中的每个初始节点都保存 char 和频率,优先级队列基于频率,以 tiebreaker 作为 char 的数值。
malloc_printerr (action=3, str=0x7ffff7b98938 "double free or corruption (fasttop)", ptr=0x6034b0) at malloc.c:5027
这是结构体的样子,符号代表字符,权重是频率
struct treeNode
{
unsigned char symbol;
unsigned long weight;
struct treeNode* left;
struct treeNode* right;
struct treeNode* next;
};
struct queue
{
struct treeNode* first;
struct treeNode* last;
};
这是我的freeTree方法
void freeTree( struct treeNode* root )
{
if( root != NULL )
{
freeTree( root->left );
freeTree( root->right );
free( root );
}
}
这些是我在代码的主要部分中使用的变量或树节点
struct treeNode* newNode;
struct treeNode* holder;
这就是所有被调用的地方,应该通过我的队列将两个节点组合成一棵树,顶部的节点等于两个输入节点的权重,这应该一直持续到仅队列包含一棵大树
while( treeCount > 1 )
{
newNode = combineTwo( q->first, q->first->next );
if( charCount == 2 )
{
holder = q->first;
q->first = q->first->next;
freeTree( holder );
holder = q->first;
q->first = newNode;
freeTree( holder );
}
else
{
holder = q->first;
q->first = q->first->next;
freeTree( holder );
holder = q->first;
q->first = q->first->next;
freeTree( holder );
insertSortedNode( q, newNode );
}
charCount--;
holder = NULL;
}
这是我的 combineTwo 方法,它将两个输入节点变成一个节点上的叶子
struct treeNode* combineTwo( struct treeNode* first, struct treeNode* second )
{
struct treeNode* newNode = createNode( '\0', (first -> weight) + (second -> weight));
if( first -> weight > second -> weight )
{
newNode -> right = first;
newNode -> left = second;
}
if( first -> weight < second -> weight )
{
newNode -> left = first;
newNode -> right = second;
}
if( first -> weight == second -> weight )
{
if( first -> symbol > second -> symbol )
{
newNode -> right = first;
newNode -> left = second;
}
if( first -> symbol < second -> symbol )
{
newNode -> left = first;
newNode -> right = second;
}
}
return newNode;
}
如果需要更多信息,我将整天在这里回答任何需要的问题
【问题讨论】:
-
treeNode.next是指向什么的指针?它是子节点之一吗? -
while( treeCount > 1 )什么是树数? stackoverflow.com/q/23529555/905902 -
treeNode* -> next 与队列一起使用,当调用 next 时,它将进入队列中的下一个节点,并且您为我链接的页面不存在
-
treeCount 是队列中元素或树的数量,所以就像我给出的示例一样,如果输入文件有 5 个不同的字符,那么我的代码将使用 5 个不同的 treeNodes 创建一个队列
-
@Happilystoned:是的,它仍然存在。 (对于某些人)