Usuwanie z Listy Jednokierunkowej

0
Kopiuj
 
//==============================================================================

procedure Wyswietlanie(a: TStringGrid);
var
i: Integer;
Current:Wsk;
begin
Current := First;
  i := 0;

  while Current <> nil do
   begin

    i := i+1;
    a.RowCount:=i+1;
    a.Cells[0,i] := Current^.imie;
    a.Cells[1,i] := Current^.nazwisko;

    Current:=Current^.Next;

end;
end;

//==============================================================================

procedure Usuwanie (n:Integer);
var
i:Integer;
Current, Previous:Wsk;

begin
Current := First;
      if n = 1 then
       begin
        First := First^.Next;
        dispose(Current);
       end
    else
     begin
        for i:=1 to n do
          begin
            Previous := Current;
            Current := Current^.Next;
          end;
        if Current^.Next <> nil then
          Previous^.Next:= Current^.Next

        else
        Previous^.Next:=nil;
        dispose(Current);
      end;
end;

//==============================================================================

Witam! Usuwanie pierwszego elementu z listy działa, jednakże przy innych elementach wyświetla się komunikat o błędzie "Access violation...". Gdzie leży przyczyna tego błędu, z góry dziękuję za odpowiedzi.
Pozdrawiam, Jakub

1

jesli access violation to prawdopodobnie gdzies probujesz sie odwolac do czegos co nie istnieje... w takim wypadku:
http://4programmers.net/Delphi/Artykuły/Debugowanie

//tylko nie pisz ze "to nie jest odpowiedz na Twoje pytanie" jak co niektórzy piszą w takiej sytuacji. umiejętność debugowania to podstawa, dzieki niemu sam naprawisz 90% podobnych bledow w pare minut. olej to, a bedziesz pytal o takie rzeczy na forum pare razy w tygodniu - szkoda czasu.
uwierz mi, ze dalsze programowanie bez umiejetnosci debugowania nie ma sensu.

druga sprawa, ze listy jednokierunkowe to bardzo powszechna rzecz, szczególnie wśród zadan dla uczniow/studentow. zaloze sie ze w internecie znajdziesz tysiace przykladow kodu do obslugi takiej listy. wystarczy przesledzic dokładnie i porownac ze swoim.

0

Nie mogłem patrzeć na to twoje coś co miało udawać usuwanie więc napisałem porządnie...

Kopiuj
  procedure Usuwanie(n: integer);
  var
    i: integer;
    Current, Previous: Wsk;

  begin
    Current  := First;
    Previous := nil;
    while current <> nil do
    begin
      Inc(i);
      if i = n then
      begin
        if i = 1 then
          First := Current^.Next
        else
          Previous^.Next := Current^.Next;
        Dispose(Current);
        break;
      end;
      Previous := Current;
      Current  := Current^.Next;
    end;
  end; 

Nie testowane więc dodaj co tam potrzebujesz.

BTW. Nie rozumiem po co ci TStringGrid.
Wydaje mi się że ktoś kto nie rozumie co pisze próbuje coś napisać, po prostu uwielbiam to.

0

EDIT: Niestety, powstał kolejny problem. Po usunięciu ostatniego wiersza nie wyświetlają się nowe wiersze.

Kopiuj
//==============================================================================

procedure Wyswietlanie(a: TStringGrid; b: TEdit; c:TEdit);
var
i: Integer;
Current:Wsk;

begin
for i:=0 to a.ColCount do
begin
  a.Cols[i].Clear;
end;

for i:=0 to a.RowCount do
begin
  a.Rows[i].Clear;
end;

Current := First;
  i := 0;

   while Current <> nil do
   begin

    i := i+1;
    a.RowCount:=i+1;
    a.Cells[0,i] := Current^.imie;
    a.Cells[1,i] := Current^.nazwisko;

    Current:=Current^.Next;

end;
b.Clear;
c.Clear;
end;

//==============================================================================


procedure Usuwanie (n:Integer; s:TStringGrid);
var
i:Integer;
Current, Previous:Wsk;

begin
i:=0;
 begin
    Current  := First;
    Previous := nil;
    while current <> nil do
    begin
      Inc(i);
      if i = n then
      begin
        if i = 1 then
          First := Current^.Next
        else
          Previous^.Next := Current^.Next;
        Dispose(Current);
        break;
      end;
      Previous := Current;
      Current  := Current^.Next;
    end;
  end;
  end; 
-pB_No- napisał(a):

BTW. Nie rozumiem po co ci TStringGrid.
Wydaje mi się że ktoś kto nie rozumie co pisze próbuje coś napisać, po prostu uwielbiam to.

Mylisz się, rozumiem co piszę, a jest on po to by w parametrach podać w jakim StringGridzie dane mają być wyświetlane.
Bez takiego ciśnienia proszę Pana...

1

Mylisz się, rozumiem co piszę, a jest on po to by w parametrach podać w jakim StringGridzie dane mają być wyświetlane.
Bez takiego ciśnienia proszę Pana...

To ty się mylisz, bo zobacz jaką masz definicję procedury Usuwanie. Możesz mi wytłumaczyć co ma Usuwanie do wyświetlania? No właśnie.

W sumie to wydaje mi się że jedziesz na gotowcach+minimalnej wiedzy, ale nie martw się, akurat w tym często się mylę

Co do usuwania ostatniego parametru, to możliwe że moja procedura usuwanie failuje jeżeli ostatni element nie ma ustawionego nexta na nil. Inaczej z moich obliczeń powinna ustawiać poprawnie nil w poprzednim obiekcie.
Zrób użytek z tego co się nauczyłeś (debugger) i podaj dokładniejsze informacje o miejscu błędu itd.
+Ja nie widziałem procedury dodawania elementów.

0

Zwracam honor ze StringGridem, faktycznie głupota :) W Delphi robię od dwóch tygodni, więc jeszcze dużo przede mną.

Procedura dodawania, zaraz zajmę się debugger'em

Kopiuj
 procedure Dodaj(imie: string; nazwisko:string);
var
Current:Wsk;
begin
  New(Current);
  Current^.Next:=nil;
  Current^.Imie:=imie;
  Current^.Nazwisko:=Nazwisko;
  if First = nil then
  begin
    First:=Current;
    Last:=First
  end
  else begin
    Last^.Next:=Current;
    Last:=Current;
  end;

end;
1

Zwracam honor ze StringGridem, faktycznie głupota W Delphi robię od dwóch tygodni, więc jeszcze dużo przede mną.

Ja się dosyć rzadko mylę :P.

A z tym Usuwaniem problem jest taki że nie ustawiam Last gdy jest potrzebna zmiana, musisz to poprawić albo przerobić dodawanie żeby nie zwracał uwagi na Last. Podpowiem jak to mniejwięcej zrobić (poprawkę do Usuwanie): Jeżeli to ostatni element to ustaw last na previous.

0

Dziękuję bardzo, wszystko śmiga jak należy.
Pozdrawiam :)

0

Dziękuję bardzo, wszystko śmiga jak należy.
Pozdrawiam

Normalni ludzie robią jeszcze pare rzeczy:
1.Publikują rozwiązanie
2.Plusują posty które pomogły
3.Zaznaczają zielonym ptaszkiem odpowiedź która ostatecznie zakończyła problem.

1
Kopiuj
procedure Usuwanie (n:Integer; s:TStringGrid);
var
i:Integer;
Current, Previous:Wsk;
 
begin
i:=0;
 begin
    Current  := First;
    Previous := nil;
    while current <> nil do
    begin
      Inc(i);
      if i = n then
      begin
        if i = 1 then
          First := Current^.Next
        else
          Previous^.Next := Current^.Next;
        Dispose(Current);
        break;
      end;
      Previous := Current;
      Current  := Current^.Next;
    end;
    if(n=s.RowCount-1) then
    Last:=Previous;
    Last^.Next:=Nil
  end;
end;
-pB_No- napisał(a):

Normalni ludzie robią jeszcze pare rzeczy [...]

Naprawdę, daruj sobie złośliwe komentarze, to nie jest miejsce na to! Możemy się spotkać w cztery oczy i zobaczymy czy będziesz taki wygadany.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.