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