我做了这个 BinaryTree 实现,它工作正常,除了 freeTree() 方法说我正在尝试释放一个未分配的指针。我只是找不到我的逻辑在这里出错的地方。 我不知道如何准确找到它所在的指针。 有什么提示、技巧吗?
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>
struct BinaryTree
{
int data;
struct BinaryTree *left;
struct BinaryTree *right;
};
typedef struct BinaryTree BinaryTree;
FILE *input;
FILE *output;
char dat[99];
int number;
BinaryTree tree;
void add(int data, BinaryTree *tree);
void inorderTraversal(BinaryTree *tree);
void freeTree(BinaryTree *tree);
int main()
{
input = fopen("/Users/sergeymikhaylyuk/Desktop/Program/Tree/input.txt", "r");
output = fopen("/Users/sergeymikhaylyuk/Desktop/Program/Tree/sorted.txt", "w");
while (fgets(dat, sizeof(dat), input))
{
sscanf(dat, "%i", &number);
add(number, &tree);
}
inorderTraversal(&tree);
freeTree(&tree);
}
void add(int data, BinaryTree *tree)
{
if (tree->data == 0)
{
tree->data = data;
}
else
{
if (tree->data < data && tree->right != NULL)
{
add(data, tree->right);
}
else if (tree->data < data)
{
tree->right = malloc(sizeof(BinaryTree));
add(data, tree->right);
}
else if (tree->data > data && tree->left != NULL)
{
add(data, tree->left);
}
else if (tree->data > data)
{
tree->left = malloc(sizeof(BinaryTree));
add(data, tree->left);
}
}
}
void inorderTraversal(BinaryTree *tree)
{
if (tree != NULL)
{
if (tree->left != NULL)
{
inorderTraversal(tree->left);
}
fprintf(output, "%i ", tree->data);
if (tree->right != NULL)
{
inorderTraversal(tree->right);
}
}
}
int i = 1;
void freeTree(BinaryTree *tree)
{
printf("%i ", i);
i++;
if (tree != NULL)
{
if (tree->left != NULL)
{
freeTree(tree->left);
}
if (tree->right != NULL)
{
freeTree(tree->right);
}
free(tree);
}
}
最佳答案
根节点因为这条线在栈上
BinaryTree tree;
所有其他节点都在堆上。
但是您的freeTree
函数释放了包括根在内的所有节点。因此它给出错误 trying to free a pointer which hasn't been malloced error
。
最简单的解决方法是将上面的更改为
BinaryTree * ptree = malloc(sizeof(BinaryTree));
ptree->data = 0;
ptree->left = NULL;
ptree->right = NULL;
并将所有使用 &tree
的地方更改为 ptree
。
例如。
add(number, &tree);
到
add(number, ptree);
除此之外,您还需要在所有地方 malloc
后将 left 和 right 初始化为 NULL。
例如。之后
tree->right = malloc(sizeof(BinaryTree));
添加
tree->right->data = 0;
tree->right->left = NULL;
tree->right->right = NULL;
关于未分配正在释放的 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224452/