Dlaczego usuwając liść w drzewie bst on się nie usuwa, jak wpisuje do niego wartość NULL w funkcji delete?
Bo nie usuwasz niczego. Przecież to
wsk == NULL;
nic nie robi. Zapewne miałeś na myśli
wsk = NULL;
ale nawet wtedy to nic nie robi oprócz przypisywania NULL do jakiegoś tymczasowego wskaźnika.
Myślę, że powinieneś wrócić do lekcji ze wskaźnikami zanim się zabierzesz za poprawę tego programu.
Miało być wsk = Null lecz to nic nie zmienia.
twonek napisał(a):
Myślę, że powinieneś wrócić do lekcji ze wskaźnikami zanim się zabierzesz za poprawę tego programu.
A co jest nie tak?
wsk to ma byc wskaznik do tej liczby ktora usuwamy.
kaczor5373 napisał(a):
wsk to ma byc wskaznik do tej liczby ktora usuwamy.
Uwierz mi, ja wiem czym jest wsk
w tamtym kodzie. Za to Ty nie rozumiesz jak działa wskaźnik, więc żeby w pełni wyjaśnić co robisz źle trzeba by wyjaśnić czym jest wskaźnik, stąd rekomendacja, żebyś jeszcze raz przerobił materiał z książki/tutoriala.
do wsk wpisuje potem adres null, czyli ten wskaznik nie powinien na nic pokazywac, wiec dlaczego zostaje tam liczba 2. Uzyc delete?
Przecież to, że ten tymczasowy wskaźnik już nie wskazuje na ten obiekt nie sprawia, że ten obiekt nagle magicznie zniknie. Pomijam już mało istotny w tym momencie fakt, że mogą istnieć inne wskaźniki wskazujące na ten obiekt, np. ojciec tego węzła.
Uzyc delete?
Cieplej.
Przecież już Ci mówiłem, że to
wsk = NULL;
nic nie robi.
Miałeś użyć delete
, pokaż mi palcem gdzie to robisz.
Po usunięcie węzła nie aktualizowałeś wskaźnika w rodzicu, przez co nadal wskazywał na stare miejsce (które już nie jest poprawnym obiektem). Potrzebne jest coś w stylu
rodzic->prawy = NULL;
(to czy prawy
czy lewy
zależy od konkretnego przypadku).
Oczywiście żeby to zrobić trzeba nie tylko sam węzeł z daną wartością znaleźć, ale też jego rodzica.
Można to rozwiązać poprzez szukanie węzła, którego dziecko ma wartość liczba
a nie węzła z tą wartością.
Jak można tak sobie życie utrudniać?!
Wezel *ReturnWezel(int liczba)
{
for(Wezel *wsk=korzen;wsk;) if(liczba<wsk->liczba) wsk=wsk->lewy; else if(liczba>wsk->liczba) wsk=wsk->prawy; else break;
return wsk;
}