我正在用c中的bitstring创建一个二叉树。即1100100创建一棵树:
1
/ \
1 1
我决定使用递归函数来构建这个树但是我不断收到错误 调试断言失败了...... 表达式:CrtIsValidHeapPointer(pUserData)
这是我的代码片段
typedef
struct Node {
char key;
struct Node *left;
struct Node *right;
} Node;
char string[1000];
int i = 0;
void insertRecursivePreorder(Node **node)
{
Node* parent = *node;
if(string[i] == '0')
{
parent = NULL;
i++;
}
else
{
Node *newn = (Node*)malloc(sizeof(Node));
newn->key = string[i];
parent = newn;
i++;
insertRecursivePreorder(&newn->left); //errors occur here
insertRecursivePreorder(&newn->right); //errors occur here
free(newn);
free(parent);
}
}
int main(void)
{
void printTree(Node* node);
Node* root = NULL;
scanf("%s", string);
insertRecursivePreorder(&root);
//... do other junk
}
我想知道为什么会出现这个错误以及我能做些什么来解决它。
答案 0 :(得分:1)
直接问题可能是在指针上调用free
两次。在insertRecursivePreorder
中,您将parent
设置为newn
,然后在两者上调用free
。作为一个例子,以下程序失败(但如果你注释掉free(..)
之一,则有效):
#include <stdlib.h>
int main() {
int *a = malloc(sizeof(int)),
*b = a;
free(a);
free(b);
return 0;
}
但是,这里的逻辑有几个问题。只有在完全完成指针后才能调用free
,因此如果您以后使用树,则无法在构建时释放它。你应该创建第二个函数recursiveDestroyTree
,它通过并在树上调用free
(从下到上!)。
而且,您可能需要*node = newn
而不是parent = newn
,因为后者是唯一实际修改node
的人。{/ p>
(您也可以更改函数以返回Node *
指针,然后转到:
root = insertRecursivePreorder();
和
newn->left = insertRecursivePreorder();
newn->right = insertRecursivePreorder();
而不是试图跟踪指针指针等。)
(此外,在风格上,使用全局变量通常是不好的做法,因此您可以使用insertRecursivePreorder
获取int i
和char * string
参数并使用它们而不是全局变量。 )
答案 1 :(得分:0)
问题是:你从未在'insertRecursivePreorder'中分配双指针,所以root总是保持为NULL。
#include <stdio.h>
#include <stdlib.h>
typedef
struct Node {
char key;
struct Node *left;
struct Node *right;
} Node;
/* slightly changed the syntax for the str
** ; now '.' indicates a NULL pointer, values represent themselves.
*/
char *string = "12..3.." ;
/* Removed the global index 'i' */
void printTree(Node* node, int level);
unsigned insertRecursivePreorder(Node **pp, char *str);
unsigned insertRecursivePreorder(Node **pp, char *str)
{
unsigned pos =1;
if (!*str) { *pp = NULL; return 0; } /* safeguard for end of string */
if (*str == '.') { *pp = NULL; return pos; }
*pp = malloc(sizeof **pp);
(*pp)->key = *str;
pos += insertRecursivePreorder(&(*pp)->left, str+pos);
pos += insertRecursivePreorder(&(*pp)->right, str+pos);
return pos;
}
void printTree(Node* node, int level)
{
unsigned pos,len;
len = level> 0 ? level : -level;
for (pos =0; pos < len; pos++) putchar (' ');
if (!level) printf ("Root=");
else if (level<0) printf ("Left=");
else printf ("Right=");
if (!node) { printf( "Null\n" ); return; }
printf("Key=%c\n", node->key );
printTree(node->left, -(len+1) ) ;
printTree(node->right, len+1) ;
}
int main(void)
{
Node *root = NULL;
unsigned result = 0;
result = insertRecursivePreorder(&root, string);
printf( "Result=%u\n", result);
printTree(root, 0);
return 0; printTree(root, 0);
}
输出:
Result=7
Root=Key=1
Left=Key=2
Left=Null
Right=Null
Right=Key=3
Left=Null
Right=Null