Usuwanie rekordu w liście dwukierunkowej

0
TYPE TRekord = RECORD
 imie: string;
 wiek: integer;
 end;

TYPE StosPtr = ^Stos;
Stos = record
 gorny : StosPtr;
 dolny : StosPtr;
 zawartosc: TRekord;
end;


var
   wierzch : StosPtr;
   wybor : char;
   liczba : integer;
   koniec : StosPtr; 


procedure usun(k:integer);
begin
koniec := wierzch;
if k > policz then exit;
while k > 1 do
begin
  dec(k);
  koniec := koniec^.dolny
end;
if((koniec^.dolny = NIL) and (koniec^.gorny = NIL)) then wierzch := NIL
else if(koniec^.dolny = NIL) then
  koniec := NIL
else if koniec^.gorny = NIL then
     wierzch := koniec^.dolny
else
begin
  koniec^.zawartosc.imie := koniec^.dolny^.zawartosc.imie;
  koniec^.zawartosc.wiek := koniec^.dolny^.zawartosc.wiek;
  koniec^.dolny := koniec^.dolny^.dolny;
  koniec^.dolny^.gorny := koniec;
 //koniec^.gorny^.dolny := koniec^.dolny;
  //koniec^.dolny^.gorny := koniec^.gorny
end;
end;

Jest to część programu. Próbowałem już na kilka sposobów, ale ciągle jest ten sam problem. Np. mam 5 elementów i jak dam, by usunęło drugi element, to owszem, usuwa go, lecz niszczą się też poprzednie rekordy. Może mi ktoś wytłumaczyć, gdzie popełniam błąd?

2

Już ci kiedyś mówiłem, błąd znowu i znowu popełniasz ten sam, brak formatowania więc nie widzisz nic.

1

Jeszcze raz powtarzam jak tylko pierwszego ifa niepoprawnie ustawiłeś w formatowaniu to już spieprzyłeś całą funkcje trzeba wszystko usunąć i zacząć od nowa.

procedure usun(k:integer);
var tmp:StosPtr;
begin
  tmp:=wierzch;
  while (k>1)and(tmp<>nil) do
  begin
    Dec(k);
    tmp:=tmp^.dolny;
  end;
  if tmp=nil then exit;
  if tmp^.dolny<>nil then tmp^.dolny^.gorny:=tmp^.gorny else koniec:=tmp^.gorny;
  if tmp^.gorny<>nil then tmp^.gorny^.dolny:=tmp^.dolny else wierzch:=tmp^.dolny;
  Dispose(tmp); // lub FreeMem - zależy jak przydzielasz
end;
2
pasasap napisał(a)

W Lazarusie to piszę, ledwo, ale piszę.

A co ma środowisko do tego? W czym innym niby chcesz to pisać sprawniej? W TP7?

pasasap napisał(a)

Pascal dla mnie jest coraz bardziej abstrakcyjny.

Pascal od lat prawie w ogóle się nie zmienił; To, że nie potrafisz siąść do kursu i raz a dobrze nauczyć się podstaw to nie znaczy, że język z biegiem czasu staje się coraz bardziej pogięty;

pasasap napisał(a)

Jeszcze denerwujące średniki, których nie potrzeba na końcu instrukcji.

A w których to niby przypadkach nie potrzeba średników? Tak można jedynie stwierdzić w przypadku ostatniej instrukcji w danym bloku, bo w takim przypadku można, ale nie trzeba; W przypadku instrukcji warunkowych albo musi się postawić średnik, albo postawić go nie wolno; Jasne zasady, więc żadnej abstrakcji tutaj nie ma; Skoro tak powszechna rzecz jak stawianie średników Cię przerasta, to powinieneś się lepiej zastanowić nad tym, czy już aby na pewno nie czas na powrót do nauki podstaw języka; A jeśli dopiero ich się uczysz, to czas się bardziej skupić;

Bez względu na to w jakim języku będziesz chciał pisać, jeśli nie zapamiętasz składni i zasad pisania kodu to nigdy nie napiszesz działającego poprawnie programu/skryptu;

Co do reszty zgadzam się z poprzednikiem, dodatkowo także zwracam uwagę na formatowanie kodu, przez które obfuskujesz go do tego stopnia, że nie rozumiesz jak działa i co jest gdzie; Do tego jeszcze polskie identyfikatory i żadnych zasad dotyczących nazewnictwa; Dziwisz się, że nic z tego nie rozumiesz i nie potrafisz znaleźć błędu; Już nie wspominam o użyciu debugera, dzięki któremu bez problemu da się rozwiązać +/-95% błędów/bugów.

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