Witam. Czy mógłby ktoś zerknąć dlaczego kod nie działa? Dodawanie elementów do listy chodzi dobrze ale jest problem z sortowaniem. Już dwa tygodnie nad tym siedzę dlatego proszę o pomoc. Podejrzewam ze jest problem w procedurze NowyNastepny. Jeśli tak to czy ma ktoś pomysł jak to zmienić? Z góry dziękuje za pomoc.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Windows, Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Koniec: TButton;
Info: TButton;
Sortuj: TButton;
Losuj: TButton;
Label1: TLabel;
Lista: TLabel;
ListBox1: TListBox;
ListBox2: TListBox;
procedure FormCreate(Sender: TObject);
procedure InfoClick(Sender: TObject);
procedure KoniecClick(Sender: TObject);
procedure LosujClick(Sender: TObject);
procedure SortujClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
type
tWezel = record
x: integer;
Nastepny: ^tWezel;
end;
tPWezel = ^tWezel;
var
Wezel: ^tWezel;
Wezel2: ^tWezel;
Wezel3: ^tWezel;
WezelN2: ^tWezel;
WezelN4: ^tWezel;
Wezel_Pierwszy: ^tWezel;
WezelNowy: ^tWezel;
WezelN2_Pierwszy: ^tWezel;
Wezel_Koniec: ^tWezel;
Nowy: ^tWezel;
x,i,: integer;
procedure NowyNastepny;
begin
if Wezel<>nil then begin
new(WezelN2);
WezelN2^.x:=Wezel2^.x;
WezelNowy^.Nastepny:=Wezel^.Nastepny;
Wezel^.Nastepny:=WezelN2;
end;
end;
procedure NowyOstatni;
begin
if Wezel^.Nastepny=nil then begin
new(WezelN2);
WezelN2^.x:=Wezel2^.x;
WezelN2^.Nastepny:=nil;
Wezel^.Nastepny:=WezelN2;
end;
end;
procedure Usun;
begin
while Wezel <> nil do
if Wezel2 = Wezel_Pierwszy then begin
Wezel:=Wezel_Pierwszy;
Wezel_Pierwszy:=Wezel_Pierwszy^.Nastepny;
dispose(Wezel);
Wezel:=Wezel_Pierwszy;
exit;
end else begin
Wezel3^.Nastepny:=Wezel2^.Nastepny;
dispose(Wezel2);
Wezel:=Wezel_Pierwszy;
exit;
end;
end;
function Szukaj(Wezel: tPWezel; x: integer): tPWezel;
begin
Wezel:=Wezel_Pierwszy;
new(Wezel2);
new(Wezel3);
while Wezel <> nil do
begin
if Wezel=Wezel_Pierwszy then begin
Wezel2:=Wezel;
Wezel:=Wezel^.Nastepny;
if Wezel^.x<Wezel2^.x then
begin
Szukaj:=Wezel;
NowyNastepny;
Usun;
exit;
end;
end else begin
if Wezel^.x<Wezel2^.x then
begin
Szukaj:=Wezel;
NowyNastepny;
Usun;
exit;
end;
end;
Wezel3:=Wezel2;
Wezel2:=Wezel;
Wezel:=Wezel^.Nastepny;
end;
Szukaj:=nil;
end;
procedure TForm1.LosujClick(Sender: TObject);
begin
if Wezel=nil then begin
new(Wezel_Pierwszy);
new(Wezel);
Wezel_Pierwszy:=Wezel;
i:=1;
randomize;
Wezel^.x:=random(100);
ListBox1.Items.Add(IntToStr(i)+' '+IntToStr(Wezel^.x));
end
else begin
while Wezel^.Nastepny <> nil do Wezel:=Wezel^.Nastepny;
new(WezelNowy);
randomize;
WezelNowy^.x:=random(100);
i:=i+1;
ListBox1.Items.Add(IntToStr(i)+' '+IntToStr(WezelNowy^.x));
WezelNowy^.Nastepny:=nil;
Wezel^.Nastepny:=WezelNowy;
end;
end;
procedure TForm1.SortujClick(Sender: TObject);
begin
Szukaj(Wezel,x);
Wezel:=Wezel_Pierwszy;
while Wezel <> nil do begin
ListBox2.Items.Add(IntToStr(Wezel^.x));
Wezel:=Wezel^.Nastepny;
end;
end;
procedure TForm1.KoniecClick(Sender: TObject);
begin
Application.Terminate
end;
oclick
. Sam nieraz tak robię, ale tylko w przypadku prostych, testowych projektów, kiedy chcę szybko przetestować jakiś prosty kod nie bawiąc się w OOP