Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

c++ - Błąd w destruktorze

jowyma 05 Cze 2015 14:56 630 11
  • #1 05 Cze 2015 14:56
    jowyma
    Poziom 22  

    Proszę o pomoc bo nie umiem sobie poradzić z destruktorem. Tworzę drzewo binarne korzystając z dynamicznej alokacji pamięci, a destruktor ma je usuwać z pamięci.
    Niestety, gdzieś popełniam błąd, którego nie potrafię znaleźć. Proszę o pomoc.
    Załączam cały program, ale błąd jest w destruktorze.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 11
  • Pomocny post
    #2 05 Cze 2015 16:25
    krru
    Poziom 32  

    Zmienna przekazywana do metody remove nie ulega zmianie - (wskaźnik ogniwo *), więc w jaki sposób root na się stać NULL-em?

    1
  • #3 05 Cze 2015 18:22
    Rezystoreczek
    Poziom 20  

    by to działało to musiałbyś zrobić tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #4 05 Cze 2015 19:33
    jowyma
    Poziom 22  

    Wciąż coś jest nie tak. Zeruję już wskaźniki, które traktuję delete, ale gubię przy kasowaniu część wartości. Nie wiem dlaczego, problem tkwi w kasowaniu nody, która ma dwoje dzieci. Robię tak, że znajduję następnika i podmieniam wartości, czyli do nody która miała być skasowana wpisuję wartość następnika, a kasuję następnika.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 05 Cze 2015 19:42
    Dżyszla
    Poziom 42  

    To kasowanie jakieś skomplikowane...
    Ja bym widział je w prosty sposób -
    0. Jeśli przekazano NULL to wylatuj.
    1. Jeśli jest coś na prawo, to wywołaj rekurencyjne dla prawo
    2. Jeśli jest coś na lewo to wywołaj rekurencyjne dla lewo
    3. Skasuj przekazany węzeł.

    Dwa if'y i jeden delete.
    Poza tym zrezygnuj z takich oznaczeń x, y w odniesieniu do parametrów / zmiennych - strasznie zaciemniają obraz.

    0
  • #6 05 Cze 2015 20:09
    jowyma
    Poziom 22  

    Ja chcę aby jeden przebieg tej funkcji kasował jedną nodę. Wtedy mogę tej funkcji używać także do kasowania pojedynczego elementu w drzewie, niekoniecznie dla całego drzewa.

    0
  • #7 05 Cze 2015 20:52
    Dżyszla
    Poziom 42  

    Ale wciąż możesz jej tak użyć. Rekurencja usuwa dany węzeł i wszystko pod nim.

    Natomiast jednym przebiegiem nie załatwisz kasowania drzewiastej struktury pod tym - przynajmniej nie w ten sposób nie angażując kolejnej sporej porcji pamięci.

    0
  • #8 05 Cze 2015 21:07
    jowyma
    Poziom 22  

    Mój program nie usuwa wszystkiego po nodzie. On tylko usuwa jeden konkretny element, przesuwając odpowiednie elementy w jej miejsce.

    0
  • #9 05 Cze 2015 21:36
    Dżyszla
    Poziom 42  

    To może opisz algorytm, bo naprawdę nie do końca wiem, co tak naprawdę to usuwanie ma zrobić. Ot choćby ten fragment, gdzie jeśli jest coś na prawo i lewo to idziesz ciągle w lewo aż do liścia, a następnie go usuwasz, tyle, że wskazanie do niego nie jest zmieniane.

    0
  • #10 05 Cze 2015 22:47
    Rezystoreczek
    Poziom 20  

    A może spójrz, jest jeszcze taka opcja: :!:


    Kod: c
    Zaloguj się, aby zobaczyć kod


    zamiast

    Kod: c
    Zaloguj się, aby zobaczyć kod

    :D

    wtedy nie masz problemu z usuwaniem roota.

    0
  • Pomocny post
    #12 07 Cze 2015 13:03
    -psiak-
    Poziom 32  

    Może warto zapoznać się z poprawniejszym podejściem, przecież masz C++ z konstruktorami i destruktorami, więc używaj tego:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    1