Pascal - problem z listą

Witam,

mam taki kod:

program test;


type

  plista = ^lista;

  lista = record

    id: integer;

    imie: string[40];

    nast: plista;

  end;


function dodaj_koniec(element: plista; imie:string):plista; {dodaje element na koniec listy}

var nowyElement: plista;

begin

     new(nowyElement);

     nowyElement^.id:=1;

     nowyElement^.imie:=imie;

     nowyElement^.nast:=nil;

     if element = nil then begin

        element:=nowyElement;

     end

     else begin

        element:=element^.nast;

        element:=nowyElement;

     end;

     dodaj_koniec:=element;

end;

procedure print(element: plista);

begin

     repeat

           writeln(element^.imie);

           element:=element^.nast;

     until element=nil;

end;

  var glowa, element: plista;


begin

     glowa:=nil;

     element:=nil;

     glowa:=element;

     element:=dodaj_koniec(element, 'adam');

     element:=dodaj_koniec(element, 'tomek');

     element:=dodaj_koniec(element, 'asdf');

     print(glowa);

     readln;

end.

dlaczego to nie działa?

Na początku ustawiam głowa jako element. Chcę, aby głowa wskazywała na pierwszy element cały czas. Lista rośnie poprzez wskaźnik element, a aby ją odczytać - zaczynam od pierwszego elementu (czyli głowa).

Niestety wypisanie glowa^.nast kończy się błędem.

Proszę o pomoc.

pozdrawiam.

new(nowyElement);

     nowyElement^.id:=1;

     nowyElement^.imie:=imie;

     nowyElement^.nast:=element;

     dodaj_koniec:=nowyElement;

lub:

new(nowyElement);

     nowyElement^.id:=1;

     nowyElement^.imie:=imie;

     nowyElement^.nast:=nil;

     poprzElement:=nil;

     tmpElement:=element;

     while tmpElement<>nil do

     begin

        poprzElement:=tmpElement;

        tmpElement:=tmpElement^.nast;

     end;

     if poprzElement=nil then element:=nowyElement

     else poprzElement^.nast:=nowyElement;

     dodaj_koniec:=element;

Dzięki!

możesz mi powiedzieć, dlaczego próbując wypisać

print(glowa)

program się wysypuje (przecież glowa wskazuje na 1. element)? jeśli zrobię

print(element)

wszystko wypisuje w odwrotnej kolejności, a wskaźnik element nie wskazuje na pierwszy element listy. dlaczego

nowyElement^.nast:=element;

wg schematu ostatni element ma wskazywać na nil

Ponieważ napisałeś:

element:=dodaj_koniec(element, ‘adam’);

a nie:

glowa:=dodaj_koniec(glowa, ‘adam’);

Pierwsza wersja dodaje na początek, zrobiłeś listę jednokierunkową bez wskaźnika na koniec więc dodawanie na koniec możliwe dopiero po przeleceniu całej listy - drugi wariant.