Kolejka, wskaznik na ostatni element

0

Witam.
Mam kolejke i chcialbym udoskonalic jej dzialanie, tj dodac wskaznik na ostatni element i uzyc go przy wstawianiu do kolejki, zeby nie przechodzic na koniec tylko uzyc tego wskaznika. Prosze o pomoc.

program Kolejka1111;

{$APPTYPE CONSOLE}

uses
SysUtils;
type
TWskaznik = ^TElement;
TElement = record
Liczba : Byte;
Nast,Ost : TWskaznik;
end;

var
Kolejka:TWskaznik;
Liczba:Byte;
Znak:Char;
procedure Ustaw (Liczba: Byte);
{ Procedura ustawia w element w kolejce. }
var
E, Pop, Nast : TWskaznik;
begin
New(E);
E^.Liczba := Liczba;
E^.Nast := Nil;
if (Kolejka = nil) then
begin
E^.Nast := Kolejka; Kolejka := E;
end
else
begin
Pop := Kolejka; Nast := Kolejka^.Nast;
while (Nast <> nil) do
begin
Pop := Nast;
Nast := Nast^.Nast;
end;
E^.Nast := Nast;
Pop^.Nast := E;
end;
end;

function Obsluz: Byte;
{ Funckja zwraca wartosc pierwszego elementu z kolejki }
{ do obsluzenia, jednoczesnie go z niej usuwajac. }
var
E : TWskaznik;
begin
if (Kolejka = nil) then
Obsluz := 0
else
begin
E := Kolejka;
Obsluz := E^.Liczba;
Kolejka := E^.Nast;
end;
end; {------------------------------------------ Obsluz -}
procedure WypiszKolejke;
{ Procedura wypisuje wszystkie elementy kolejki. }
var
E : TWskaznik;
begin
E := Kolejka;
while E <> nil do
begin
Write (E^.Liczba, ' ');
E := E^.Nast;
end;
end; {----------------------------- WypiszKolejke -}

begin
{ TODO -oUser -cConsole Main : Insert code here }
Kolejka := nil;

repeat
Write('Kolejka: ');
WypiszKolejke;
Writeln;
writeln('U - ustaw w kolejce , O - obsluz , K - koniec');
readln(Znak);
Case Znak of
'U' : begin
repeat
Write ('Podaj liczbe z zakresu (1..255): ');
Readln (Liczba);
until Liczba>0;
Ustaw (Liczba);
end;
'O' : begin
Liczba := Obsluz;
if Liczba = 0 then
Writeln ('Nie ma czego obslugiwac, kolejka pusta.')
else
Writeln ('Element do obsluzenia: ', Liczba);
end;
end;
if ((Znak='U') or (Znak='O')) then
begin
Write ('Nowa kolejka: ');
WypiszKolejke;
Writeln; Writeln ('Wcisnij Enter');
Readln;
end;
until (Znak = 'K');
end.
</delphi>

0

Moim zdaniem kombinujesz jak koń pod górkę.
W momencie dodawania elementu i tak musiałbyś przeiterować WSZYSTKIE i zmienić im adres ostatniego elementu. Czyli masz więcej roboty niż chciałeś mieć.

Może po prostu stosuj dwukierunkową listę, dzięki czemu będziesz mógł iść w przód lub w tył.

0

Ale ew. mógłbyś użyć globalnego wskaźnika na koniec listy, który aktualizowałbyś po dodaniu nowego elementu lub po usunięciu ostatniego.

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