Witam!

Mam 'ogromny' problem z dwoma procedurami w programie opartym na liście podwieszanej. Nie mam pojęcia jak zapisać dane z listy do pliku, próbuje póki co w jakiś sposób zrobić równoległy zapis dwóch type'ów. Wynikiem są ciągłe crashe lub niedziałanie w sposób zamierzony przeze mnie. Mógłby ktoś rzucić okiem na te bzdury?

type
    kategoria=^podkat;
    zad=^dane;
    podkat=record
                 kat:string;             {nazwa kategori}
                 nast:kategoria;        {nastepne pyt/odp w kategori}
                 zadania:zad;           {lista zadan w podkategoriach}
           end;
    dane=record
               pytanie,odpowiedz:string;   {tresc pytania i odp}
               nast:zad;                   {nastepne pytanie}
         end;


procedure zapisz_plik(ka:kategoria; nazwa:string);

var
   plik_bin: file of podkat;
   bpodk:kategoria;
   rekord:podkat;
   rekord2:dane;
   bzad:zad;
begin
     writeln;
     if(ka=nil) then
          writeln('Brak danych do zapisania!')
     else
     begin
          assign(plik_bin, nazwa);
          rewrite(plik_bin);
          bpodk:=ka;
          while (bpodk<>nil) do
          begin
               bzad:=bpodk^.zadania;
               while (bzad<>nil) do
               begin
                    rekord.kat:=bpodk^.kat;
                    rekord2.pytanie:=bzad^.pytanie;
                    rekord2.odpowiedz:=bzad^.odpowiedz;
                    write(plik_bin, rekord);
                    bzad:=bzad^.nast;
               end;
               writeln;
               bpodk:=bpodk^.nast;
          end;
          close(plik_bin);
     end;
end;


procedure odczyt_plik(nazwa:string);

var
   plik_bin: file of podkat;
   rekord: podkat;
   rekord2: dane;

begin
	assign(plik_bin, nazwa);
	{$I-}
	reset(plik_bin);
	{$I+}
	if ioresult=0 then
		begin
			while not eof(plik_bin) do
				begin
					read(plik_bin, rekord);
					Dodaj(glowa,rekord.kat,rekord2.pytanie,rekord2.odpowiedz);
				end;
			close(plik_bin);
			writeln('Wczytano!');		
		end
	else
		writeln('Plik nie istnieje!');
end;