Zapis dzewa do pliku i jego ponowny odczyt

0

Witam, zastanawiam się jak dobrze zapisać drzewo do pliku i je potem bez problemow odczytać. Już omawiam problem: wklepuje do drzewa jedno słowo i równocześnie zapisuje to do pliku, potem kolejne itd(słowa szereguje alfabetycznie) - tak być musi. Potem chciałbym aby z tego pliku wczytać te słowa do drzewa - i tu pojawia się problem z ich uszeregowaniem, bo do pliku zapisywało mi się zawsze po kolei jak się je wpisywało... Czy ma ktoś jakiś pomysł?

0

Zapisuj w preorder same dane.
Przy odczycie normalnie dodawaj do drzewa - zostaną dodane dokładnie jak było.

0

dziękuje!

0

Czy ma ktoś jakiś pomysł?

Tak - podać kod, który zapisuje drzewo do pliku :]

A tak na poważnie - nie wiem dlaczego każdorazowo aktualizujesz plik po dodaniu nowego słowa do drzewa; Nie możesz zapisać go na koniec? Poza tym zapis drzewa do pliku nie jest taki prosty, jak w przypadku list (jednokierunkowych czy dwukierunkowych);

Napisz jeszcze z jakich plików obecnie korzystasz i pokaż kod, który zajmuje się aktualizowaniem pliku.

0

W sumie na dobrą sprawe zapisywać się może to drzewo przy wyłączaniu programu. Na pewno to jest dobry pomysł.

procedure add(var root:Pnode; thing:string);
begin
  if root = nil then
  begin
      new(root);
     root^.name:=thing;
   {tu chcialem zrobic zapis 'thing'a do pliku}
root^.left:=nil;
     root^.right:=nil;
  end
  else
  if ord(root^.name[1]) > ord(thing[1]) then
  begin
        add(root^.left, thing);
  end
  else
     add(root^.right, thing);
     end;             
 

Jak macie jakis lepszy pomysł to byłoby super :)

Do tego chciałbym aby każda rzecz w tym drzewie miała swoją liste(np byłby tam: kolor, kształt, wielkość, waga) - i do tego "kolor" był kolejną listą, z której mógłbym wybrać odpowiedni kolor dla przedmiotu(niestety mam takie wymagania na studiach :( )

0
if ord(root^.name[1]) > ord(thing[1]) then

Możesz skrócić do:

if Root^.Name[1] > Thing[1] then

użycie funkcji Ord nie jest konieczne;

W sumie na dobrą sprawe zapisywać się może to drzewo przy wyłączaniu programu. Na pewno to jest dobry pomysł.

Dobrym pomysłem było by opakowanie tego drzewa w klasę, w której była by przewidziana do tego metoda; Tę metodę wywoływałbyś w dowolnym momencie - np. przed zwolnieniem instancji klasy z pamięci;

Do tego chciałbym aby każda rzecz w tym drzewie miała swoją liste(np byłby tam: kolor, kształt, wielkość, waga) - i do tego "kolor" był kolejną listą, z której mógłbym wybrać odpowiedni kolor dla przedmiotu

W takim razie każdy węzeł powinien posiadać np. strukturę zamiast pojedynczego łańcucha, której zawartość zależy tylko i wyłącznie od tego jakie dane musi przechowywać i jakiego typu.

0

W takim razie każdy węzeł powinien posiadać np. strukturę zamiast pojedynczego łańcucha

Jeszcze myslałem nad tym, zeby zrobić coś takiego:

każdej rzeczy przyporządkować numer i tak samo zrobić z cechami(cechy mogą być na stale wpisane- tak będzie łatwiej:P)
i łączyć je na zasadzie takiej tabeli
[1][1]
[1][3]
[2][5]
[2][8]
[3][1]
[3][2]

Tylko nie wiem jak sie za to zabrać, jeśli macie jakieś pomysły to byłbym wdzięczny.

0

Nadanie indeksu w drzewie mogłoby mieć sens, ale nie było by to ani prostsze, ani bardziej intuicyjne. Po prostu zamiast stringa przechowuj sobie na każdym wierzchołku drzewa jakiś rekord, z polami, które Ci odpowiadają.
W ostateczności, jeśli jesteś taki przywiązany do tego pomysłu z tablicami, to możesz sobie przechowywać na każdym wierzchołku indeks elementu tablicy, w którym przechowujesz dane.
Zdecydowanie skłaniałbym się w stronę rozwiązania nr 1, bo również łatwiej byłoby dodawać nowe elementy.

0

Po to wymyślono struktury aby nie zapisywać mnóstwa tablic.

0

Właśnie pojawił mi się problem... Jak dodać rekord do drzewa? (preorder) Chodzi mi dokladnie o to, co zadeklarować w sekcji type w moim drzewie a co w osobnym rekordzie zeby to smigalo i do tego jak je szeregowac (ten rekord mniejszy, a ten wiekszy), bo to juz nie są stringi :/

0

Głowę na ramiona zaś guzik do koszulki.
Czy myślisz że jak guzik na ramiona zaś głowę do koszulki będzie lepiej?

2

Szeregować możesz na podstawie dowolnego elementu tego przechowywanego rekordu.
Pomijając fakt, że nie rozumiem stwierdzenia 'w osobnym rekordzie'.
Jak chcesz przechowywać coś w drzewie to możesz tak zadeklarować typy i możesz nadal układać drzewo według nazwy

type
  dane=record
    name:string;
    {jakies dodatkowe dane, które chcesz przechowywac}
  end;
  Pdrzewo=^drzewo;
  drzewo=record
    informacje:dane;
    lewy,prawy:Pdrzewo; 
  end; 
 
0

Tak, to rozumiem. Tylko problem u mnie pojawił się wtedy gdy chcialem dodać ten record do drzewa

 procedure add(var root:Pnode; thing:dane);
begin
  if root = nil then
  begin
      new(root);
     root^.name:=thing;
   root^.left:=nil;
     root^.right:=nil;
  end
  else
  if ord(root^.name[1]) > ord(thing[1]) then {to nie chce dzialac}
  begin
        add(root^.left, thing);
  end
  else
     add(root^.right, thing);
     end;             
 

Mógłby ktoś coś podpowiedzieć?

0

Patrz na swoje struktury i na wiersz w którym masz błąd.

0
if ord(root^.name[1]) > ord(thing[1]) then {to nie chce dzialac}

@Groza - może zamiast ręcznie sprawdzać tylko pierwsze znaki, wykorzystasz gotową do tego celu funkcję, jak AnsiCompareStr? No i to jest dziwne:

ord(thing[1])

thing jest parametrem typu dane - czym jest ten dane? Pokaż jakieś deklaracje - nikomu raczej nie chce się zgadywać.

0

Oparłem się na deklaracjach kolegi wyżej

dane=record
    name:string; 
model:string;
price:real;
amount:byte;

do tego mam tablice tych recordów

r:array[1..100] of dane;
ReadLn(r[licznik].model);

Drzewo będzie posiadało rekordy (dane) z modelami tych rzeczy, czyli pobieram od użytkownika to

ReadLn(r[licznik].model);

i wrzucam do procedury

add(root, r[licznik].model);

tylko nie wiem jak mam potem tą procedure przerobić, bo na stringach działało dobrze:(

dodanie nowych znaczników <code class="delphi"> i poprawienie istniejących + połączenie postów - fp

1

Skoro użyłeś tak sformułowanych typów to:

  1. Name jest polem rekordu dane. Więc jak chcesz się odwołać name w roocie to robisz to tak:
root^.informacje.name
  1. W takim razie zamiast
root^.name:=thing

powinno być root^.informacje.name:=thing

Jak poprawisz te błędy powinno być ok
0

Dzięki, ale to mi nie pomogło :(
Czy byłby ktoś w stanie spróbować napisać jak powinna wygladac procedura wstawiania takiego recordu do drzewa?

0

O Zgrozo!
Masz trzy warianty:

  1. Poczytać pierwsze kilka stron pierwszego lepszego kursu po czym w godzinę zrobić to sam
  2. Dalej kontynuować tego tasemca dopóki cały nie wyląduje w koszu kiedy moderatorzy upewnią się że nic oprócz gotowca do ciebie nie przemawia.
  3. Zamówić wykonanie gotowca u fachowca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1