🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#92056
Author: Piotrek
Date: Mon, 03 Sep 2007 16:26
45 lines
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
#92057
Author: Piotrek
Date: Fri, 07 Sep 2007 09:50
4 lines
975 bytes
Mógłby ktoś zerknąć i skomentować?

-- 
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: prośba o sprawdzenie procedury
#92058
Author: DarekM
Date: Fri, 07 Sep 2007 16:14
50 lines
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