Mam problem w napisaniu procedureki (Wskaźniki)

0

Część ostatnio<ort> zaczołę </ort>poznawać zmienne wskaźniki, nigdy wcześniej ich nie używałem ale powoli spostrzegam ich możliwości. Pisze programik bazę danych wykorzystywującą wskaźnik rekordu. Umiem dodawać nowe rekordu, wyświetlac listę ale nie wychodzi mi usuwanie określonej pozycji o to mo przykład

<font color="red"> type PCVS = ^TCVS; TCVS = record KEY : String[10]; NEXT: PCVS; end;

var
cvs : pcvs;

procedure Add(S : String);
var
cv : pcvs;
begin
New(cv);
cv^.key := S;
cv^.next:= cvs;
cvs := cv;
FreeMem(cv);
end;

procedure List;
var
cv : pcvs;
begin
cv := cvs;
while cv <> nil do
begin
Writeln(cv^.key);
cv := cv^.next;
end;
end;

begin
cvs := nil;
add('Naprzyklad');
List;
end.
</span>
Piszę z pamięci ale jest to przykładzik.

ort! tylko napisać procedurki do usuwania poszczególnych pozycji rekordu.

<font color="blue"> procedure Delete(S :String); var cv : pcvs; begin cv := cvs; while cv < nil do begin if cv^.key = S then ?? </span> Dzieki za <ort>jaką kolwiek</ort> radę
0

Po pierwsze...

var cvs:pcvs;

procedure Add(S:String);
var
  cv:pcvs;
begin
  New(cv);
  cv^.key := S;
  cv^.next:= cvs;
  cvs := cv;
  //FreeMem(cv);  // wy*#!*@* to w ch*%!*$!
end;

po drugie:

procedure Delete(S:String);
var
  l,cv:pcvs;
begin
  cv:=cvs;
  l:=nil;
  while cv<>nil do
    begin
      if cv^.key=S then
        begin
          if l=nil 
            then cvs:=cv^.next
            else  l^.next:=cv^.next;
          Dispose(cv);  // i skoro new() to dispose()
          break
        end;
      l:=cv;
      cv:=cv^.next;
    end
end;
0

Generalnie chodzi o to że przy stosowaniu listy musisz pamiętać, żeby nie zgubić żadnego wskaźnika. Tzn.

a.next wskazuje na b
b.next wskazuje na c
c.next wskazuje na d

jeśli więc chcesz skasować elenent b, to musisz a.next ustawić na element c żeby nic nie zgubić w liście.

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