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ł?
Zapisuj w preorder same dane.
Przy odczycie normalnie dodawaj do drzewa - zostaną dodane dokładnie jak było.
dziękuje!
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.
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 :( )
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.
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.
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.
Po to wymyślono struktury aby nie zapisywać mnóstwa tablic.
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 :/
Głowę na ramiona zaś guzik do koszulki.
Czy myślisz że jak guzik na ramiona zaś głowę do koszulki będzie lepiej?
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;
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ć?
Patrz na swoje struktury i na wiersz w którym masz błąd.
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ć.
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
Skoro użyłeś tak sformułowanych typów to:
- Name jest polem rekordu dane. Więc jak chcesz się odwołać name w roocie to robisz to tak:
root^.informacje.name
- W takim razie zamiast
root^.name:=thing
powinno być root^.informacje.name:=thing
Jak poprawisz te błędy powinno być ok
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?
O Zgrozo!
Masz trzy warianty:
- Poczytać pierwsze kilka stron pierwszego lepszego kursu po czym w godzinę zrobić to sam
- 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.
- Zamówić wykonanie gotowca u fachowca.