линейный список

  • Автор темы mannequin
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

mannequin

#1
задание: найти в списке min элемент и вставить его после каждого четного элемента.

проблема: если список заканчивается четным элементом, то не происходит ожидаемой обработки))) если же список кончается нечетным то все работает хорошо)) помогите пожалуйста решить эту проблему. заранее спасибо



[codebox]unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);


end;
u = ^Uzl;
Uzl = Record
i :Integer;
L :u;
end;

const n=10;

var
Form1: TForm1;
j: integer;
h: u;
st: string;
buf,min: integer;


implementation

{$R *.dfm}

procedure createlist(var h:U);
var t: u;
begin new(h);
h^.i:=50-random(100);
t:=h;
for j:=1 to n-1 do begin
new(t^.l);
t:=t^.l;
t^.i:=50-random(100);
end;
t^.l:=nil;
end;

procedure printlist(h:u);
begin
st:='';
while h<>nil do begin
st:=st + IntToStr(h^.i)+' ';
h:=h^.L;
end;

end;

procedure minim(h:u);
begin
min:=h^.i;
h:=h^.l;
while h<>nil do begin
if min>h^.i then begin min:=h^.i;
h:=h^.l;
end
else h:=h^.l;
end;
end;

procedure obr(var h:U);
var p,t,s: u;
begin
t:=h;
p:=t^.L;
while t<>nil do begin
if (t^.i mod 2=0) or (t^.i=0) then begin
new (s);
s^.i:=min;
t^.L:=s;
s^.L:=p;
end;
t:=p;
p:=p^.L;
if p=nil then begin
if (t^.i mod 2=0) or (t^.i=0) then begin
t^.L:=s;
s^.L:=nil;
exit;
end
else t^.L:=nil;
exit;
end;
end;
end;


procedure tform1.Button1Click(Sender: TObject);
begin
createlist(h);
printlist(h);
Label1.Caption:=st;
end;

procedure tform1.Button2Click(Sender: TObject);
begin
minim(h);
obr(h);
printlist(h);
Label2.Caption:=st;
Label3.Caption:='минимальный элемент = '+inttostr(min);
end;

end.[/codebox]

ошибка в процедуре obr. вроде бы в ней)
 
Статус
Закрыто для дальнейших ответов.