이진 검색 트리를 코딩하고 노드를 삭제하는 함수를 만들었습니다. 일반적으로 두 개의 입력 매개 변수가 있습니다. 첫 번째는 삭제되어야하는 객체를 가리키는 포인터이고 두 번째는 이진 검색 트리의 루트에있는 점입니다.포인터를 유효하지 않게 설정하는 방법은 무엇입니까?
노드가 잎인 "가장 쉬운"것 외에도 기본적으로 모든 사례가 작동합니다.
내 코드는 삭제해야 할 노드의 내용을 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