Blockread listy jednokeirunkowej

0

Witam. Mam taki problem chcaiłbym wczytać sobie z pliku taką listę jednkierukową takiego typu:

 
type
dog=record
  number:integer;
  next:features;
end; 

Lista wcześniej zapisana, po kolei, tzn 1 elemnt to głowa, zakoćzona elementem wyglądajacym tak:

 
last^.next:=nil;

W jaki sposób ją wczytać z powrotem, najlepiej funkcją Blockread w pamięć, bo znamy jej długość.
Czy tak się nie da, i jesteśmy zmuszeni wczytywać element za elementem, łącząc na nowo wskaźnikami wszytskie elementy?
Dziękuje za pomoc. Pozdrawiam

0

Bez udziwnień - tylko element po elemencie.
Oczywiście da się to wczytać blockreadem - ale to będzie sztuka dla sztuki.

0

Nic wiele nie zaszalejesz z BlockRead, dlatego że w przypadku list musisz zapisywać jedynie dane każdego węzła, pomijając pola wskaźnikowe, bo je musisz tworzyć dynamicznie przy odczycie danych z pliku; Poza tym jedyne dane w węźle listy to jedna biedna liczba typu Integer, więc można to dużo szybciej zapisać - jeśli znasz ilość węzłów w liście (jeżeli jest np. opakowana w klasę i w jakimś polu jest przechowywana ich liczba) to można zadeklarować sobie bufor o rozmiarze IlośćWęzłów * SizeOf(Integer) i dane każdego węzła wpisać do bufora, po czym cały bufor zapisać przez BlockWrite; To samo tylko odwrotnie zrobić przy odczycie;

Poza tym biorąc pod uwagę deklarację rekordu można się spodziewać, że Twoja lista będzie nietypowa, bo w normalnej liście, gdzie każdy węzeł jest tego samego typu, wskaźnik na kolejny węzeł (lub też poprzedni - w przypadku listy dwukierunkowej) wskazują na ten sam typ co struktura, w której znajduje się to pole; U Ciebie struktura jest typu dog, a wskaźnik na kolejny element już typu features (hmm... gdzieś już pojawiła się taka nazwa typu);

Żeby cokolwiek można było doradzić musisz podać więcej kodu, tak żeby było wiadomo jak wygląda lista i jak jest budowana w pamięci.

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