stos dodaj zdejmij,czysc ...error

0

mam liste i mam do niej takie procedury

procedure dodaj_glowe(s:string);
begin
new(glowa);
glowa^.str:=s;
glowa^.wsk:=nil;
end;
procedure dodaj(s:string);
var
pom,nowy:wskaznik;
begin
if glowa=nil then dodaj_glowe(s)
else
begin
pom:=glowa;
While  pom^.wsk<> nil do
pom:=pom^.wsk;
new(nowy);
nowy^.str:=s;
nowy^.wsk:=nil;
pom^.wsk:=nowy;
end;
end;
function zdejmij_ost :string;
var pom,pom2:wskaznik;
buf:string;
begin
pom:=glowa;
if glowa^.wsk = nil then
begin
buf :=glowa^.str;
dispose(glowa);
glowa:=nil;
end
else
begin
while pom^.wsk<> nil do
pom:=pom^.wsk;
buf:=pom^.str;
pom2:=glowa;
while (pom2^.wsk<>pom) do
pom2:=pom2^.wsk;
pom2^.wsk:=nil;
dispose(pom);
end;
zdejmij_ost:=buf;
end;
procedure czysc;
var
us:wskaznik;
begin
while glowa <> nil do
begin
us:=glowa^.wsk;
dispose(glowa);
glowa:=us;
end;
end;

dodaj,i zdejmi_ost(może ma ktoś pomysł na szybszy sposób) niby działa dobrze..ale za to nie działa czyść wskazuje w trakcie działania programu ze nie może dispose...poza tym nie wiem czemu wydaje mi się ze na samym końcu obliczeń glowa.^wsk=glowa;

0
elmo123 napisał(a)

...poza tym nie wiem czemu wydaje mi się ze na samym końcu obliczeń glowa.^wsk=glowa;

Dlaczego? na końcu jeśli czyścisz listę, to glowa = nil, a glowa^.wsk może mieć akurat wartość <>nil, ale to nie będzie nic oznaczać.

Co do kodu, to deklarując

type wskaznik = ^w;
     w = record
          s : string;
          wsk : wskaznik;
         end;

Nie miałem żadnego problemu z procką dispose.

Co do szybkości, to nie podoba mi się, że przy każdej operacji przeszukujesz cała listę od początku... Przecież i tak używasz tylko ostatniego elementu (przy dodawaniu i zdejmowaniu listy), więc nie zapamiętuj w liście wskaźnika do elementu kolejnego tylko poprzedniego i w ten sposób glowa będzie wkazywać na element ostatni, a nie pierwszy (i do pierwszego dojdziesz w ten sposób, że wsk, czyli poprzednik będzie równy nil).

Pozdro.

0

jakby glowa była nil i wskaznik był nil towszystko było by ok ale jak chcę wypisać stos to sie zapetla czyli glowa=glow.wsk i glowa.wsk <> nil
a z tą szybkości ato masz rację tylze moze nie będe tak kombinowal tylko dam dodatkową zmienną która będzie przechowywaa adres do ostatnej komórki..a co z tym dispose bład brzmi : "error 204:invalid poniter operation"

0

Ten błąd oznacza, że próbujesz zwolnić pamięć z czegoś na co jej nie rezerwowałeś, więc dużo mi nie mówi w tej sytuacji. Wklej tu kod, w którym inicjujesz listę i co potem z nią robisz, bo procedury są bez zarzutu. Jedyne co mi przychodzi do głowy to zainicjowanie glowa :=nil na początku programu, zanim wykonasz jakąkolwiek operację. I daj tu wreszcie deklarację typu wskaznik, żeby nie było nieporozumień!

Pozdro.

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