我知道这看起来很简单,但是在过去的几个小时里我一直在试图弄清楚为什么我这么做,这个节点始终是NULL。因为这是null,这意味着实际上没有任何东西最终被添加到树中。有没有任何想法? Arghhh
struct node *tra(struct node * start, Type input)
{
struct node * thisNode = start;
if (thisNode == NULL)
return thisNode;
else
{
Type current = thisNode -> el;
if (strcmp(input, current) > 0)
return tra(thisNode -> right, input);
else if (strcmp(input, current) < 0)
return tra(thisNode -> left, input);
else
return thisNode;
}
}
Ta insert(Type input, Ta ta)
{
if ((find(input, ta)) == FALSE)
{
struct node *newEl = tra(ta -> head, input);
newEl = (struct node*)malloc(sizeof(struct node));
newEl -> el = input;
newEl -> left = NULL;
newEl -> right = NULL;
}
return ta;
}
Boolean find(Type input, Ta ta)
{
if (tra(ta -> head, input) == NULL)
return FALSE;
else
return TRUE;
}
答案 0 :(得分:1)
问题在于:
struct node *newEl = tra(ta -> head, input);
newEl = (struct node*)malloc(sizeof(struct node));
你分配新节点,但是指针newEl会丢失。你的函数tra应该返回一个指向指针的指针,让insert函数修改你附加新创建节点的节点。
答案 1 :(得分:0)
问题如下:
如果BST中没有任何内容,则会在tra
:
if (thisNode == NULL)
return thisNode;
然后newEl == NULL
中的insert
。
然后你malloc
为指针newEl
分配一个指向已分配内存的新值。但是您返回的原始指针仍然具有值NULL
(因为给指针的副本一个新值不会改变原始指针)。
处理此问题的选项:
struct node **
)的指针(我认为您还需要将指针作为参数传递给insert
函数。)tra
中的支票,查看下一个元素(以及相应的更改)。对于链接列表,它看起来像:if (thisNode->next == NULL) return thisNode;
,而在insert
中,您可以使用newEl->next
。虽然通常是链接列表的一个很好的选择,但这对BST来说需要更多的努力,因为您需要返回左侧或右侧节点是NULL
,还是在insert
中再次执行此检查。
newEl->left
中的newEl->right
或insert
。tra
以返回struct node *&
并将newEl
声明更改为struct node *&newEl = ...
,这可能就是全部。