我的C程序中的函数出现问题。该计划的目的是:
除了能够释放我的二叉树之外,我已经完成了所有工作。这是树和节点的结构(a.k.a. leaf)。
typedef struct Node *NodeP;
typedef struct Tree *TreeP;
// Definition of a tree
struct Tree
{
NodeP root;
}Tree;
// Definition of a node
struct Node
{
int data;
NodeP L, R;
}Node;
在我的程序中,我使用malloc为我的树和每个单独的节点分配内存。所以我调用一个函数来释放树及其所有节点。
/*
* Frees the memory allocated for
* each node
*/
void freeNode(NodeP p)
{
if(p == NULL) return;
freeNode(p->L);
freeNode(p->R);
free(p);
}
/*
* Frees the memory allocated
* for the tree
*/
TreeP freeTree(TreeP tree)
{
if(tree->root == NULL)
free(tree);
else
{
freeNode(tree->root);
free(tree);
}
return NULL;
}
当我运行这个程序时,我的调试器给了我这个错误。
EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
我试过精神上经历了递归的每次迭代,我找不到为什么它会给我一个错误。我认为它在边缘情况下从树的边缘掉下来了?我不确定。非常感谢任何帮助!
编辑:
这是下载完整程序的链接。我包含了README和我正在使用的二进制文件。一个长度只有10个整数,另一个长度为20000个。感谢您的帮助!
答案 0 :(得分:3)
这里有困惑:
// Definition of a tree
struct Tree
{
NodeP root;
}Tree;
// Definition of a node
struct Node
{
int data;
NodeP L, R;
}Node;
上面的定义定义了变量,而不是类型!
这里有一个错误:
TreeP newTree()
{
TreeP tree = (TreeP) malloc(sizeof(TreeP));
tree->root = NULL;
return tree;
}
应该阅读TreeP tree = malloc(sizeof(struct Tree));
。一个很好的例子,说明为什么输入结构指针是一个坏主意。由于Tree只保存一个指针,因此不会引起任何问题,但应该修复它。
这是 THE 错误:
/*
* Creates a new node in the tree
*/
void insertTreeNode(TreeP tree, int data)
{
NodeP p = tree->root;
Boolean b = FALSE;
/* Creates a node and tests for errors */
NodeP node = (NodeP) malloc(sizeof(Node));
if(node == NULL)
fprintf(stderr, "Memory allocation failed! \n");
else
{
node->data = data;
node->L = NULL;
node->R = NULL;
/* Inserts in empty tree case */
if(tree->root == NULL)
tree->root = node;
else
{
/* Inserts in any other case */
while(p != NULL && b != TRUE)
{
if(node->data >= p->data)
{
if(p->R == NULL)
{
p->R = node;
b = TRUE;
}
else p = p->R;
}
if(node->data <= p->data) // replace this line with else
{
if(p->L == NULL)
{
p->L = node;
b = TRUE;
}
else p = p->L;
}
}
}
}
}
您必须将新节点链接到节点p的左侧或右侧,但如果p->data == data
,则必须不在两个子树中。
可能还有其他错误,但是这个错了!