我編寫了一個二叉搜索樹,並創建了一個刪除節點的函數。 通常它有兩個輸入參數,第一個是指向需要刪除的對象的指針,第二個指向二叉搜索樹根。如何設置指針無效?
基本上,我所有的情況下工作,除了「最簡單」的節點是葉。
我的代碼將應該刪除的節點的內容設置爲0,但是仍然有對此的引用,並且它顯示在樹中。
* p是應該被刪除的元素。
* pBaum指向樹的根部。
* p-> right和* p-> left指向* p的右和左子樹。
* p-> conten是* p的值。
我的代碼在葉案:
struct tnode *deletenode(struct tnode *p, struct tnode *pBaum)
{
if (p !=NULL)
{
if ((p->left == NULL) && (p->right == NULL))
{
printf("%d Ist Blatt \n", p->content);
free(p);
return pBaum;
}
Basicly我「只」需要告訴指針* P,它從現在起無效。但我無法找到一個合適的解決方案。也許你們可以幫忙。
編輯:好吧,我已經嘗試過,我自己將父指針設置爲NULL。
struct tnode* danglingPointerFix (struct tnode *p, int nodtodelete)
{
if((p->right)->content = nodtodelete)
{
p->right = NULL;
return 0;
}
if((p->left)->content = nodtodelete)
{
p->left = NULL;
return 0;
}
}
struct tnode *searchnode(struct tnode *p, int nodtodelete)
{
if (p == NULL)
{
printf("Baum ist leer oder Element nicht vorhanden \n");
return 0;
}
if (p -> content == nodtodelete)
{
return p;
}
if (p->content < nodtodelete)
{
danglingPointerFix(p, nodtodelete);
return searchnode (p->right, nodtodelete);
}
if (p->content > nodtodelete)
{
danglingPointerFix(p, nodtodelete);
return searchnode(p->left, nodtodelete);
}
}
但即時segfaulting,也許某處可以看到哪裏,因爲在我看來這個解決方案應該工作。
是否有原因將指針設置爲NULL不是一個可行的選項?但是,也許你正在看着這個錯誤的方式。通常,當維護這樣的樹時,您將設置左右節點的指針,以便它們不再引用已刪除的節點。 –
是不是忘記了對「p」的引用? –
0XDEADBEEF有時用於標記指針無效 – monkeyStix