Mam program realizujący kolejkę:
program Projekt;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
type TZesp = class
Re, Im: real;
constructor Create(a, b: real);
end;
constructor TZesp.Create(a, b: real);
begin
Re := a;
Im := b;
end;
type PKolejka = ^TKolejka;
TKolejka = record
Number: TZesp;
Next: PKolejka;
end;
type KKolejka = class
Head: PKolejka;
Tail: PKolejka;
constructor Create;
procedure Push(e: TZesp);
function Pop:TZesp;
procedure Show;
procedure Remove;
procedure RemoveAll;
end;
constructor KKolejka.Create;
begin
Head := nil;
Tail := nil;
end;
procedure KKolejka.Push(e: TZesp); //dodawanie elmentu do kolejki
var Nowy: PKolejka;
begin
New(Nowy);
Nowy^.Number := TZesp.Create(e.Re, e.Im);
Nowy^.Next := nil;
if Head = nil then //<---------------------------------------------------------------
begin
Head := Nowy;
Tail := Nowy;
end
else begin
Tail^.Next := Nowy;
Tail := Nowy;
end;
end;
function KKolejka.Pop: TZesp; //pobieranie elementu z kolejki
var Temp: PKolejka;
begin
if Head = nil then
begin
writeln('Kolejka pusta');
end
else begin
Result := Head^.Number;
Temp := Head;
Head := Head^.Next;
Dispose(Temp);
end;
end;
procedure KKolejka.Show; //wypisanie kolejki
var Temp: PKolejka;
begin
if Head = nil then writeln('Kolejka pusta')
else Temp := Head;
while Temp <> nil do
begin
writeln(Temp^.Number.Re,' + ',Temp^.Number.Im,'j');
Temp := Temp^.Next;
end;
end;
procedure KKolejka.RemoveAll; //usuniecie kolejki
var Temp: PKolejka;
begin
while Head <> nil do
begin
Temp := Head^.Next;
Dispose(Head);
Head := Temp;
end;
end;
procedure KKolejka.Remove; //usuniecie jednego elementu
var Temp: PKolejka;
begin
if Head <> nil then
begin
Temp := Head^.Next;
Dispose(Head);
Head := Temp;
end;
end;
var
kolejka: KKolejka;
liczba: TZesp;
begin
kolejka.Create;
kolejka.Push(TZesp.Create(3.5,4.5));
kolejka.Push(TZesp.Create(3,5));
kolejka.Push(TZesp.Create(35,4));
kolejka.Show;
liczba := kolejka.Pop;
kolejka.Show;
readln;
end.
#Przy uruchomieniu, w zaznaczonym miejscu wyrzuca wyjątek External: SIGSEGV
. Debugowanie w Lazarusie jest trochę toporne, ale udało mi się dowiedzieć, że w momencie zwracania wyjątku, Head ma wartość Cannot access memory at address 0x8
. Nie wiem co z tym zrobić.
#Czy taka realizacja kolejki jest poprawna?