Thread View: pl.comp.lang.pascal
3 messages
3 total messages
Started by Piotrek
Mon, 03 Sep 2007 16:26
prośba o sprawdzenie procedury
Author: Piotrek
Date: Mon, 03 Sep 2007 16:26
Date: Mon, 03 Sep 2007 16:26
45 lines
2159 bytes
2159 bytes
Czy poniższa procedura, mająca usunąć z danej listy jednokierunkowej wszystkie
elementy o wartości podanej jako parametr e, działa dobrze czy też może
się "wysypać" dla jakiegoś szczególnego przypadku? Uprzejmie proszę o jej
sprawdzenie, ewentualnie skorygowanie (s to wskaźnik do początku listy, której
elementy są rekordami o 2 polach: jedno z nich, typu "dane", przechowuje
wartość liczbową, drugie, typu "next", jest wskaźnikiem do następnego elementu
listy):
procedure usunzlisty(s:wsk;e:integer);
var pred,succ:wsk;
begin
pred:=s;
succ:=s; {na początku oba wskaźniki wskazują na początek listy}
if s<>nil then {sprawdzenie czy lista jest niepusta}
while pred<>nil do
if pred^.dane=e then {pred wskazuje na szukany element o kluczu-wartości e}
if pred=s then {znaleziony element jest pierwszy na liście}
begin
pred:=pred^.next;
dispose(succ);
succ:=pred;
s:=pred;
end
else {znaleziony element nie jest pierwszy na liście}
begin
pred:=pred^.next;
dispose(succ^.next);
succ^.next:=pred;
end
else {pred nie wskazuje na szukany element}
begin
succ:=pred;
pred:=pred^.next;
end;
end;
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: prośba o sprawdzenie procedury
Author: Piotrek
Date: Fri, 07 Sep 2007 09:50
Date: Fri, 07 Sep 2007 09:50
4 lines
975 bytes
975 bytes
Mógłby ktoś zerknąć i skomentować? -- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: prośba o sprawdzenie procedury
Author: DarekM
Date: Fri, 07 Sep 2007 16:14
Date: Fri, 07 Sep 2007 16:14
50 lines
2622 bytes
2622 bytes
Piotrek pisze:
> Czy poniższa procedura, mająca usunąć z danej listy jednokierunkowej wszystkie
> elementy o wartości podanej jako parametr e, działa dobrze czy też może
> się "wysypać" dla jakiegoś szczególnego przypadku? Uprzejmie proszę o jej
> sprawdzenie, ewentualnie skorygowanie (s to wskaźnik do początku listy, której
> elementy są rekordami o 2 polach: jedno z nich, typu "dane", przechowuje
> wartość liczbową, drugie, typu "next", jest wskaźnikiem do następnego elementu
> listy):
dla mnie za skomplikowane, mało przejrzyste
>
> procedure usunzlisty(s:wsk;e:integer);
> var pred,succ:wsk;
> begin
> pred:=s;
> succ:=s; {na początku oba wskaźniki wskazują na początek listy}
> if s<>nil then {sprawdzenie czy lista jest niepusta}
ten warunek nie potrzebny, while wystarczy
> while pred<>nil do
> if pred^.dane=e then {pred wskazuje na szukany element o kluczu-wartości e}
>
> if pred=s then {znaleziony element jest pierwszy na liście}
>
> begin
> pred:=pred^.next;
> dispose(succ);
> succ:=pred;
> s:=pred;
S i tak nie jest zwracany, więc jeżeli usuniesz pierwszy to lista wskazuje do nikąd
po drugie po co sprawdzasz w każdej iteracji czy to nie jest pierwsza, przerób
procedurę tak aby najpierw sprawdzić pierwszy element a potem resztę
> end
>
> else {znaleziony element nie jest pierwszy na liście}
>
> begin
> pred:=pred^.next;
> dispose(succ^.next);
masz dwa różne DISPOSE, a tak naprawdę piszesz, że zwalniasz element o określonym
e czyli powinno być prosto
if pred^.dane=e then dispose(pred)
oczywiście z zachowaniem kroczenia po liście
Darek
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads