我正在尝试在C中实现二进制搜索树(BST)。我试图向BST添加几个元素,但是当我添加第三个元素时,代码不起作用。我在gdb中调试它并发现当它为新节点执行malloc
时,第二个节点的父节点从正确的地址值更改为0x13
。
由于我觉得新节点的内存分配与旧节点的父节点之间没有关系,我不知道为什么会发生这种情况......
这是我的InsertBST
功能:
int InsertBST(Bst *p, int val)
{
PNode pnode = (PNode)malloc(sizeof(PNode));
if (pnode != NULL)
{
pnode->data = val;
pnode->lc = NULL;
pnode->rc = NULL;
if (p->root == NULL)
{
pnode->parent = NULL;
p->root = pnode;
p->size++;
return 1;
}
else
{
PNode tem = FindVal(p->root, val);
if (tem != NULL)
{
printf("Sorry, the value %d has appeared!\n", val);
return 0;
}
else
{
tem = p->root;
while (tem->lc != NULL && tem->rc != NULL)
{
if (tem->data > val)
tem = tem->lc;
else
tem = tem->rc;
}
pnode->parent = tem;
if (tem->data > val)
{
tem->lc = pnode;
}
else
{
tem->rc = pnode;
}
p->size++;
}
return 1;
}
}
else
{
printf("Allocate memory failed!\n");
return 0;
}
}
p
是指向这样结构的指针:
typedef struct BST
{
PNode root;
int size;
}Bst;
和PNode
是指向这样的结构的指针:
typedef struct NODE
{
int data;
PNode lc;
PNode rc;
PNode parent;
}Node;
答案 0 :(得分:6)
malloc(sizeof(PNode))
将分配指针所需的内存,而不是它后面的节点结构。
尝试
malloc(sizeof(*PNode))
或
malloc(sizeof(Node))