задание:Создать две очереди из случайных целых чисел. В первой найти максимальный элемент и за ним вставить элементы второй очереди.
ввожу первую очередь, нахожу максимальный; ввожу вторую очередь, запоминаю ее начальный указатель - все работает. но процедура добавления не работает
Код:
unit Unit1;
...
var
Form1: TForm1;
turn1,turn2:TlistTrn;
inf1:Tinf; inf2:Tinf;
maxEl,m,n:integer;
implementation {$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
edt1.Clear; edt2.Clear;
turn1:=TlistTrn.create; //создаем очередь 1
turn2:=TlistTrn.create; //создаем очередь 2
end;
procedure TForm1.btn7Click(Sender: TObject); //закрыть
begin turn1.free; turn2.free; end;
procedure TForm1.btn1Click(Sender: TObject); //ввод в очередь1
begin
inf1.key:=strtoint(edt1.text);
turn1.addk(inf1);
turn1.Print(lst1);
edt1.clear;
n:=n+1;
end;
procedure TForm1.btn5Click(Sender: TObject); //поиск максимального элемента очереди1
begin
maxEl:=turn1.PoiskMAX(inf1);
ShowMessage('Максимальный элемент='+IntToStr(maxEl));
end;
procedure TForm1.btn3Click(Sender: TObject); //ввод в очередь2
begin
inf2.key:=strtoint(edt2.text);
turn2.addk2(inf2);
turn2.Print2(lst2);
edt2.clear;
m:=m+1;
end;
procedure TForm1.btn6Click(Sender: TObject); //вставить очередь2 в очередь1
Var i:integer;
begin
turn1.Vstav;
turn1.Print(lst1);
end;
procedure TForm1.Button1Click(Sender: TObject); //запомнить начальный указатель очереди2
begin
turn1.sp12:=turn2.sp12;
end;
end.
Код:
unit Unit2;
...
type
TInf = record //Тип информации
inf:integer; //Данные
key:integer; //Ключ
end;
//очередь1
Tseld1=^seld1;
seld1=record
Inf:Tinf; //Информация
A1:Tseld1; //Указатель1
A2:Tseld1; //Указатель2
end;
//очередь2
Tseld2=^seld2;
seld2=record
Inf:Tinf; //Информация
A1:Tseld2; //Указатель1
A2:Tseld2; //Указатель2
end;
Type TlistTrn=class(Tobject)
sp1,spk,sp:tseld1;
sp12,spk2,sp2:tseld2;
constructor create;
procedure Addk(Inf:Tinf);
procedure Addk2(Inf:Tinf);
Procedure Print(LB1:tlistbox);
Procedure Print2(LB2:tlistbox);
Procedure AddAfter(Inf:TInf;spi:Tseld1);
Procedure Redk(var Inf:Tinf);
Function PoiskMAX(inf:Tinf):integer;
Procedure Vstav;
Procedure Red1(var Inf:Tinf);
end;
implementation
var spMAX:tseld1;
Procedure TlistTrn.Vstav;
Var vs1:Tseld1; vs12:tseld2; inf:tinf;
Begin
vs1:=spMAX;
vs12:=sp12;
repeat
red1(inf);
AddAfter(inf,vs1);
vs1:=vs1^.A1;
vs12:=vs12^.A1;
until vs12=nil;
vs1:=nil;
end;
Procedure TlistTrn.AddAfter; //Добавление элемента после заданного в двухсвязный список
begin New(sp);
sp^.Inf:=Inf;
sp^.A2:=spi;
sp^.A1:=spi^.A2;
spi^.A2:=sp;
sp^.A1^.A2:=sp; end; //******выдается ошибка!
Procedure TlistTrn.Red1(var Inf:Tinf);
begin
Inf:=sp12^.Inf;
sp2:=sp12;
sp12:=sp12^.A1;
if sp12=Nil then spk2:=Nil;
Dispose(sp2);
end;
constructor TlistTrn.create;
begin inherited create; spk:=nil; end;
Procedure TlistTrn.Addk;//добавить в конец очереди1
begin New(sp);sp^.A1:=Nil; sp^.Inf:=inf;
if sp1=Nil then begin spk:=sp; sp1:=sp; end
else begin spk^.A1:=sp; spk:=sp; end; end;
Procedure TlistTrn.Addk2;//добавить в конец очереди2
begin New(sp2); sp2^.A1:=Nil; sp2^.Inf:=inf;
if sp12=Nil then begin
spk2:=sp2;
sp12:=sp2; end
else begin spk2^.A1:=sp2;
spk2:=sp2; end; end;
Procedure TlistTrn.Redk;//взять последний элемент из очереди
Begin Inf:=spk.Inf;
if sp1=spk then begin Dispose(sp1); sp1:=Nil; spk:=Nil end
else begin sp:=sp1; while sp^.A1<>Spk do sp:=sp^.A1;
Dispose(spk); spk:=sp; spk^.A1:=Nil; end end;
Function TlistTrn.PoiskMAX; //поиск максимального эл-та в очереди1
Var max:integer;
Begin sp:=sp1; max:=inf.key;
While sp<>nil do Begin
If sp^.inf.key>max then begin max:=sp^.inf.key; spMAX:=sp; end;
sp:=sp^.A1; End;
Result:=max; end;
Procedure TlistTrn.Print; //печатать очередь1
var k:word;
Begin LB1.Items.Text:='';sp:=sp1;k:=0;
While sp <> Nil do Begin k:=k+1;
LB1.Items.Add(IntTostr(k)+'.'+' Число='+IntTostr(sp^.Inf.key));
sp:=sp^.A1; end; end;
Procedure TlistTrn.Print2; //печатать очередь2
var k:word;
Begin LB2.Items.Text:='';sp2:=sp12;k:=0;
While sp2 <> Nil do Begin k:=k+1;
LB2.Items.Add(IntTostr(k)+'.'+' Число='+IntTostr(sp2^.Inf.key));
sp2:=sp2^.A1; end; end;
end.