[pascal] lista ułożona alfabetycznie

0

Mam procke ktora wstawia alfabetycznie do listy slowa. Ale chce zrobic tak, ze jezeli slowo w kolejce juz mam to zeby go nie wstawialo. Gdzie mam tutaj wladowac i jakie porownanie zeby nie reagowalo na slowo, ktore juz jest na liscie??

procedure DodajDoListy(var lista : PLista; s : String);
var
  p : PLista;
  before, after : PLista;
begin
  { new(p);       }
  { p^.data:=s; }
  before:=nil;
  after:=list;
  while (after <> nil) and (p^.data > after^.data) do
  begin
    before:=after;
    after:=after^.next;
  end;
  p^.next:=after;
  if (before <> nil) then
    before^.next:=p
  else
    lista:=p;
end;
0

w ten kod to najprościej będzie chyba tak:

procedure DodajDoListy(var lista : PLista; s : String);
var
  p : PLista;
  before, after : PLista;
  jest: Boolean;
begin
  { new(p);       }
  { p^.data:=s; }
  Jest := False;
  before:=nil;
  after:=list;
  while (after <> nil) and (p^.data > after^.data) do
  begin
    if p^.data = after^.data then
      Jest := True
    else begin
      before:=after;
      after:=after^.next;
    end;
  end; 
  if not Jest then
  begin
    p^.next:=after;
    if (before <> nil) then
      before^.next:=p
    else
      lista:=p;
  end;
end;
0

Misiek... Jak będziesz lamerom odpowiadał na takie posty to nigdy się kurde nie nauczą szukać na własną rękę tylko zawsze będą takie pytania zadawać.... Przecież to podstawowy algorytm jaki się poznaje na 1 roku studiów... Jak chłopak sam nie dojdzie do tego co tam zrobił źle to się niczego nie nauczy...

0
irek napisał(a)

Przecież to podstawowy algorytm jaki się poznaje na 1 roku studiów... Jak chłopak sam nie dojdzie do tego co tam zrobił źle to się niczego nie nauczy...

Święta prawda, tylko pozwolę sobie wtrącić:

  1. Bardzo wiele osób tutaj albo nie studiuje (jeszcze/w ogóle) informatyki
  2. Z treści posta wnioskuję, że "co tam zrobił źle" trochę nie pasuje do sytuacji:
    a) Odnoszę wrażenie, że to nie jest procedurka napisana przez autora postu (jak ktoś rozumie o co tam chodzi, to nie będzie miał problemów z czymś takim), a przynajmniej niezbyt świadomie.
    b) Z tego co rozumiem, to tam nie ma żadnego błędu - jedynie autor chce dodac coś, czego mu tam brakuje, natomiast sama procedurka działa prawidłowo (zgodnie z pierwotnym założeniem - dodać w odpowiednim miejscu), ale nie tak jak chce autor postu (dodać w odpowiednim miejscu, jeśli nie istnieje).
0

chcialbym powiedziec ze procke napisalem sam:]
probowalem jakos dolozyc zeby sprawdzalo czy element jest juz na liscie np:

if (after <> nil) and (after^.data  <> s) then
begin
  new(p)
  itd... itd...
end;

probowalem na rozne spososby, sprawdzalem co moze byc zle i nie moglem dojsc. Pytanie co do niektorych - skoro nie wiem, probuje, pytam nauczyciela, siedze nad czyms dlugo i mi nie wychodzi dalej to skad mam wziac rozwiazanie? z rekawa? grzecznie pytam teraz skad.

tak na marginesie... tak jak podales Misiek nie dziala. Program zachowuje sie tak jakby nie zauwazal ze na liscie jest juz dany element:|

0
hebius napisał(a)

tak na marginesie... tak jak podales Misiek nie dziala. Program zachowuje sie tak jakby nie zauwazal ze na liscie jest juz dany element:|

fakt, nie popisałem się :/ (późno było i w ogóle :P ). Zobacz tak

procedure DodajDoListy(var lista : PLista; s : string);
var
  p : PLista;
  before, after : PLista;
begin
  { new(p);       }
  { p^.data:=s; }
  before:=nil;
  after:=list;
  while (after <> nil) and (p^.data > after^.data) do
  begin
    before:=after;
    after:=after^.next;
  end; 
  if p^.data <> after^.data then // nie chce mi się tego analizować, ale jakby 
   //nie zadziałało to zobacz czy zamiast after^.data nie będzie before^.data
  begin
    p^.next:=after;
    if (before <> nil) then
      before^.next:=p
    else
      lista:=p;
  end;
end;
0

dzieki Misiek, dziala z after^.before. Mój GŁUPI błąd polegał na tym, że dawałem warunek if (afetr <> nil) and (after^.data <> p^.data) a nie tak jak napisales if after^.data <> p^.data dzieki;)

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