Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 17:45   #1
Александра_69
Пользователь
 
Регистрация: 28.10.2011
Сообщений: 22
Печаль Две очереди

задание:Создать две очереди из случайных целых чисел. В первой найти максимальный элемент и за ним вставить элементы второй очереди.
ввожу первую очередь, нахожу максимальный; ввожу вторую очередь, запоминаю ее начальный указатель - все работает. но процедура добавления не работает


Код:
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.
Александра_69 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очереди stepanuch Паскаль, Turbo Pascal, PascalABC.NET 6 02.12.2011 20:17
Одной кнопкой выполнялись две команды "скрыть/отобразить" по очереди Vja4eslav Microsoft Office Excel 13 15.08.2011 18:01
Очереди Lucefer2007 Общие вопросы C/C++ 1 13.03.2011 16:58
очереди Nostalgia Помощь студентам 2 22.03.2010 17:48