Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
- type
- {LIST}
- {Тип основных данных.}
- {Указатель на элемент списка.}
- TPElem = ^TElem;
- {Элемент списка.}
- TElem = record
- Data : integer; {Основные данные.}
- PointNext : TPElem; {Указатель на следующий элемент.}
- end;
- {Список.}
- TDList = record
- PointBeg, PointEnd : TPElem; {Указатели на первый и на последний элементы списка.}
- end;
- { TForm1 }
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- Button3: TButton;
- Button4: TButton;
- Edit1: TEdit;
- ListBox1: TListBox;
- ListBox2: TListBox;
- ListBox3: TListBox;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure Button3Click(Sender: TObject);
- procedure Button4Click(Sender: TObject);
- procedure Edit1Change(Sender: TObject);
- private
- public
- end;
- var
- Form1: TForm1;
- implementation
- var
- n : integer;
- List1, List2 : TDList;
- Data : integer;
- {$R *.lfm}
- { TForm1 }
- {Create list}
- procedure Create_Zero_List(var a: TDList; n : integer);
- var
- i : integer;
- Elem : TPElem;
- begin
- a.PointEnd := nil;
- a.PointBeg := nil;
- for i := 0 to n-1 do begin
- New(Elem);
- Elem^.Data := 0;
- Elem^.PointNext := nil;
- if a.PointBeg = nil then begin
- a.PointBeg := Elem;
- end
- else begin
- a.PointEnd^.PointNext := Elem;
- end;
- a.PointEnd := Elem;
- end;
- end;
- function Slianie(var list1, list2, a: TPElem; n1, n2: integer): TPElem;
- var s1 : TDList;
- s : TPElem;
- n3: integer;
- begin
- n3 := n1 + n2;
- Create_Zero_List(s1,n3);
- s := s1.PointBeg;
- while (list1 <> nil) and (list2 <> nil) do begin
- if list1^.Data <= list2^.Data then begin
- s^.Data := list1^.Data;
- s := s^.PointNext;
- list1 := list1^.PointNext;
- end
- else begin
- s^.Data := list2^.Data;
- s := s^.PointNext;
- list2 := list2^.PointNext;
- end;
- end;
- if list1 = nil then begin
- while list2 <> nil do begin
- s^.Data := list2^.Data;
- s := s^.PointNext;
- list2 := list2^.PointNext;
- end;
- end
- else begin
- while list1 <> nil do begin
- s^.Data := list1^.Data;
- s := s^.PointNext;
- list1 := list1^.PointNext;
- end;
- end;
- Slianie := s1.PointBeg;
- end;
- procedure MergeSort(var a: TPElem; n : integer);
- var p1, p2: TPElem;
- k, i : integer;
- begin
- if n > 1 then begin
- k := n div 2;
- p1 := a;
- for i := 1 to k-1 do begin
- p1 := p1^.PointNext;
- end;
- p2 := p1^.PointNext;
- p1^.PointNext := nil;
- p1 := a;
- MergeSort(p1, k);
- MergeSort(p2, n-k);
- a := Slianie(p1, p2, a, k, n-k);
- end;
- end;
- procedure Create_List(var a: TDList; n : integer);
- var
- i : integer;
- Elem : TPElem;
- begin
- randomize;
- a.PointEnd := nil;
- a.PointBeg := nil;
- for i := 0 to n-1 do begin
- New(Elem);
- Elem^.Data := random(1999)-999;
- Elem^.PointNext := nil;
- if a.PointBeg = nil then begin
- a.PointBeg := Elem;
- end
- else begin
- a.PointEnd^.PointNext := Elem;
- end;
- a.PointEnd := Elem;
- end;
- end;
- procedure Create_List_Order(var a: TDList; n : integer);
- var
- i,k : integer;
- Elem : TPElem;
- begin
- randomize;
- k := -1000;
- a.PointEnd := nil;
- a.PointBeg := nil;
- for i := 0 to n-1 do begin
- New(Elem);
- Elem^.Data := random(1999)-999;
- while Elem^.Data < k do begin
- Elem^.Data := random(1999)-999;
- end;
- k := Elem^.Data;
- Elem^.PointNext := nil;
- if a.PointBeg = nil then begin
- a.PointBeg := Elem;
- end
- else begin
- a.PointEnd^.PointNext := Elem;
- end;
- a.PointEnd := Elem;
- end;
- end;
- procedure Writer1(var a : TDList; n : integer);
- var Elem : TPElem;
- begin
- Form1.ListBox1.Clear;
- if n <= 40 then begin
- Elem := a.PointBeg;
- if Elem = nil then begin
- Form1.ListBox1.Items.Add('--');
- end
- else begin
- While Elem <> nil do begin
- if Elem <> a.PointEnd then begin
- Form1.ListBox1.Items.Add(IntToStr(Elem^.Data));
- Elem := Elem^.PointNext;
- end
- else begin
- Form1.ListBox1.Items.Add(IntToStr(Elem^.Data));
- break;
- end;
- end;
- end;
- end
- else
- Form1.ListBox1.Items.Add('SOCHI KLASS!!!');
- end;
- procedure Writer2(var a : TDList; n : integer);
- var Elem : TPElem;
- begin
- Form1.ListBox2.Clear;
- if n <= 40 then begin
- Elem := a.PointBeg;
- if Elem = nil then begin
- Form1.ListBox2.Items.Add('--');
- end
- else begin
- While Elem <> nil do begin
- if Elem <> a.PointEnd then begin
- Form1.ListBox2.Items.Add(IntToStr(Elem^.Data));
- Elem := Elem^.PointNext;
- end
- else begin
- Form1.ListBox2.Items.Add(IntToStr(Elem^.Data));
- break;
- end;
- end;
- end;
- end
- else
- Form1.ListBox2.Items.Add('SOCHI KLASS!!!');
- end;
- procedure Writer3(var a : TDList; n : integer);
- var Elem : TPElem;
- begin
- Form1.ListBox3.Clear;
- if n <= 40 then begin
- Elem := a.PointBeg;
- if Elem = nil then begin
- Form1.ListBox3.Items.Add('--');
- end
- else begin
- While Elem <> nil do begin
- if Elem <> a.PointEnd then begin
- Form1.ListBox3.Items.Add(IntToStr(Elem^.Data));
- Elem := Elem^.PointNext;
- end
- else begin
- Form1.ListBox3.Items.Add(IntToStr(Elem^.Data));
- break;
- end;
- end;
- end;
- end
- else
- Form1.ListBox3.Items.Add('SOCHI KLASS!!!');
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- n := StrToInt(Edit1.Text);
- Create_List(List1, n);
- Writer1(List1, n);
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- n := StrToInt(Edit1.Text);
- Create_List_Order(List2, n);
- Writer2(List2, n)
- end;
- procedure TForm1.Button3Click(Sender: TObject);
- begin
- n := StrToInt(Edit1.Text);
- MergeSort(List1.PointBeg, n);
- Writer3(List1, n);
- end;
- procedure TForm1.Button4Click(Sender: TObject);
- begin
- Close;
- end;
- procedure TForm1.Edit1Change(Sender: TObject);
- begin
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement