我試圖在C中實現一個二叉搜索樹(BST)。我試圖添加幾個元素到BST,但是當我添加第三個時,代碼不起作用。我在gdb中調試它,發現當它爲新節點執行malloc
時,第二個節點的父節點從正確的地址值變爲0x13
。爲什麼在我的情況下「malloc」會改變不相關的指針?
因爲我覺得有新節點的內存分配和舊節點的父之間沒有關係,我不知道爲什麼會出現這種情況?
這裏是我的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
是指針狀THI的結構S:
typedef struct NODE
{
int data;
PNode lc;
PNode rc;
PNode parent;
}Node;
是否使用了[內存泄漏](http://en.wikipedia.org/wiki/Memory_leak)檢測器等[Valgrind的](HTTP: //valgrind.org/)?你用'gcc -Wall -g'編譯了嗎?你使用'gdb'調試器嗎?你在哪個操作系統上運行(Linux可能更容易)。 –
[不要強制轉換'malloc()']的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)! – 2014-01-11 11:59:09
一個很好的例子,說明如何類型化指針類型混淆。不要這樣做,這是不值得的。 'Node *'在你的所有接口中都是完美的。 –