Bubble Sort listy jednokierunkowej

0

Mam problem z implementacja sortowania bombelkowego w liscie jednokierunkowej. Przeglądając zasoby forum, wydaje mi się że wszystko powinno działać, ale nie działa. Dodanie losowych elementów do listy jest okey. Problem pojawia sie w chwili losowania. Wydaje mi się że coś namieszałem w sposobie wyświetlania posortowanych wartości, ale nie wiem jak sobie z tym poradzić.
Ktoś mógłby podpowiedziec gdzie robie błąd?

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  PElist= ^tlistEl;
  tlistEl=  record
  next: PElist;
  date: integer;
  end;

  slist= object
    public
      head: PElist;
      constructor   init;
      procedure   random_list;
      procedure   sorting_list;
      procedure   new_ele (v: integer);
      procedure   delete_from_begining;
      procedure   show_sort();
      procedure   Sort;
  end;

  { TLosowanie }

  TLosowanie = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Losuj: TButton;
    Sortuj: TButton;
    ListBox_niePosortowany: TListBox;
    ListBox_Posortowany: TListBox;
    procedure LosujClick(Sender: TObject);
    procedure SortujClick(Sender: TObject);

  private
  public
  end;

var
  Losowanie: TLosowanie;
  L: slist;
  i: integer;

implementation

{$R *.lfm}

{ TLosowanie }

procedure TLosowanie.LosujClick(Sender: TObject);
begin
  Randomize;
  ListBox_niePosortowany.clear;
  ListBox_Posortowany.clear;
  L.init;
  for i := 1 to 20 do
    L.new_ele (random(99));
    L.random_list;
end;

procedure TLosowanie.SortujClick(Sender: TObject);
begin
     ListBox_Posortowany.clear;
     L.show_sort;
     L.sorting_list;
  end;

constructor slist.init;
begin
     head := nil;
end;

procedure slist.random_list;
var
  p: PElist;
  nr: integer;
begin
  nr:= 1;
  p:= head;
  while p <> nil do
    begin
      Losowanie.ListBox_niePosortowany.Items.Add(IntToStr(nr)+ '  :  ' +IntToStr(p^.date));
      inc (nr);
      p := p^.next;
    end;
end;

procedure slist.sorting_list;
var
  sorted_variable: PElist;
  nr: integer;
begin
  nr:= 1;
  sorted_variable:= head;
  while sorted_variable <> nil do
    begin
      Losowanie.ListBox_Posortowany.Items.Add(IntToStr(nr)+ '  :  ' +IntToStr(sorted_variable^.date));
      inc (nr);
      sorted_variable := sorted_variable^.next;
    end;
end;

procedure slist.new_ele ( v : integer );
var
  nowa : PElist;
begin
  new ( nowa );
  nowa^.next := head;
  nowa^.date := v;
  head    := nowa;
end;

procedure slist.delete_from_begining;
var
  p : PElist;
begin
  p := head;
  if p <> nil then
    begin
      head := p^.next;
      dispose ( p );
    end;
end;

procedure slist.show_sort( );
var
  posort : slist;
begin
  if( head <> nil ) and ( head^.next <> nil ) then
  begin
    posort.init;
    slist.Sort;
    show_sort;
  end;
end;

procedure slist.Sort;
  var
      temp :integer;
      curr :PElist;
    didSwap :boolean;
  begin
    didSwap := true;
    while (didSwap = true) do begin
        didSwap := false;
      curr := head;
        while (curr^.next <> nil) do begin
            if (curr^.date > curr^.next^.date) then begin
                temp := curr^.date;
                curr^.date := curr^.next^.date;
                curr^.next^.date := temp;
                didSwap := true;
            end;
                curr := curr^.next;
        end;
    end;
  end;

end.

Jest to mój pierwszy post, więc jesli cos nie tak to nie krzyczcie za mocno :( Poprwie się :)single_list.zip

1

Nakreśl może miejsce, w którym masz problem bo raczej nikomu nie będzie chciało się od początku analizować Twoich "wypocin" tym bardziej, że wstawiłeś sam kod bez formularza tym samym bez możliwości uruchomienia - gdybyś cały projekt wrzucił na GIT lub przynajmniej w jednym pliku to może bym to już otworzył i zobaczył a tak to trochę zbyt wiele roboty.
Ewentualnie napisz jaka konkretnie funkcja działa nie tak jak oczekujesz i czego oczekujesz?

2

To jest totalny bajzel!

  • mylisz obiekty z rekordami
  • operujesz na nie przydzielonych obiektach
  • używasz zmiennych globalnych zamiast lokalnych
  • nie zwalniasz pamięci
  • takie sortowanie nie przejdzie, ponieważ nie sortujesz samej listy zaś sortujesz dane w tej liście
0

Kod mi jako żywo przypomina połowę pytań z forum C/C++, C ze streamami albo C z new

Niby jest klasa, konstruktor (object pascal) ale wszystko jedziemy proceduralnie (pascal)
W obiektowce dla elegancji, łatwości testowania, ekspresji bym oczekiwał prywatnej metody Swap czy swap z jaimis parametrami, na Compare też bym się nie obraził

Mix algorytmiki i programowania GUI zawsze się kończy źle....

PS. w jakiej to wybitnej szkole kolejne leśne dziadki robią dydaktykę na Delphi / Pascalu ?

1

@dziki_pingwin: dołącz do załączników cały projekt, tak aby można było pobawić się u siebie. Przy czym oczywiście najlepszą opcją na znalezienie problemu będzie użycie debuggera, prześledzenie działania metod linijka po linijce i podglądnięcie wartości wskaźników.

0
furious programming napisał(a):

@dziki_pingwin: dołącz do załączników cały projekt, tak aby można było pobawić się u siebie. Przy czym oczywiście najlepszą opcją na znalezienie problemu będzie użycie debuggera, prześledzenie działania metod linijka po linijce i podglądnięcie wartości wskaźników.

katakrowa napisał(a):

Nakreśl może miejsce, w którym masz problem bo raczej nikomu nie będzie chciało się od początku analizować Twoich "wypocin" tym bardziej, że wstawiłeś sam kod bez formularza tym samym bez możliwości uruchomienia - gdybyś cały projekt wrzucił na GIT lub przynajmniej w jednym pliku to może bym to już otworzył i zobaczył a tak to trochę zbyt wiele roboty.
Ewentualnie napisz jaka konkretnie funkcja działa nie tak jak oczekujesz i czego oczekujesz?

W drugim okienku miała się pojawić wygenerowana losowo lista, ale posortowana metodą Bubble Sort

single_list.zip

Dodałem zipa. Wydawało mi sie ze jest problem w procedurze slist.show_sort
Teraz próbuje poprawić cały kod bazując na wskazówkach @_13th_Dragon :)

Nie jest to praca zaliczeniowa, ale jedno z zadanek na cwiczenia z początku semestru. Chce się nauczyć jak to zrobić poprawnie i zrozumieć ten kod, bo nie ukrywam że mnie lekko to intryguje i nie daj spać :p

1

Po co wywołujesz?

procedure slist.show_sort( );
var
  posort : slist;
begin
  if( head <> nil ) and ( head^.next <> nil ) then
  begin
    posort.init;
    slist.Sort;
    //show_sort; //po co ta rekurencja?
  end;
end; 

a dlaczego jednak sortujesz rosnąco sam pomyśl :P

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