Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Слияние очереди

Страницы: 1
Слияние очереди, слить 2 очеради и разместиь их по убыванию или по возраст не исполюзуя сортировку(то и есть в 3 очередь записать без сортирови)
uses
crt;
type
fail=file of integer;
tlist=^list;
list=record

inf:integer;
adr:tlist;
end;
var
f1,f2,f3:fail;
ocher,ocher2,och,oh1,oh:tlist;
t,c,k,z,i,r,l:integer;
procedure sozd(var och:tlist;x:integer);
var
tmp:tlist;
begin
new(tmp);
tmp^.adr:=och;
tmp^.inf:=x;
och:=tmp;
end;
procedure Sort(ocha:tlist);
var
tmp,tmp1:tlist;
a:integer;
begin
new(tmp);
tmp1:=ocha;
while tmp1<>nil do
begin
tmp:=tmp1^.adr;
while tmp<>nil do
begin
if tmp^.inf<tmp1^.inf then
begin
a:=tmp^.inf;
tmp^.inf:=tmp1^.inf;
tmp1^.inf:=a
end;
tmp:=tmp^.adr
end;
tmp1:=tmp1^.adr
end
end;
procedure zapis_fail( var oh:tlist; var oh1:tlist);
var
tmp,tmp1:tlist;
begin
while (oh<>nil) or (oh1<>nil) do
begin
if oh^.inf<oh1^.inf then
begin
new(tmp);
sozd(ocher2,oh1^.inf);
tmp:=oh1;
oh1:=oh1^.adr;
dispose(tmp)
end
else
if oh^.inf>oh1^.inf then
begin
new(tmp1);
sozd(ocher2,oh^.inf);
tmp1:=oh;
oh:=oh^.adr;
dispose(tmp1)
end;
if (oh<>nil) and (oh1=nil) then
while oh<>nil do
begin
sozd(ocher2,oh^.inf);
oh:=oh^.adr;
end
else
if (oh=nil) and (oh1<>nil) then
while oh1<>nil do
begin
sozd(ocher2,oh1^.inf);
oh1:=oh1^.adr;
end
end;
end;
procedure vivod_fail(var osh:tlist;var f:fail);
begin
rewrite(f);
while osh<>nil do
begin
Write(f,osh^.inf);
osh:=osh^.adr
end;
close(f);
end;
procedure sozdanie(var ochk:tlist; a:integer);
var
s:integer;
begin
for i:= 1 to a do
begin
s:=random(1000)-500;
sozd(ochk,s)
end;
end;
procedure vivod(var f:fail);
var
q:integer;
begin
reset(f);
while not eof(f) do
begin
read(f,q);
write(q,' ');
end;
close(f);
end;
begin
clrscr;
randomize;
assign(f1,'fa.Tol');
assign(f2,'fat.Tol');
assign(f3,'fatik.tol');
writeln('wvedite kol-vo elementov v 1-om faile');
readln©;
writeln('wvedite kol-vo elementov v 2-om faile');
readln(t);
sozdanie(och,c);
sozdanie(ocher,t);
sozdanie(oh,c);
sozdanie(oh1,t);
Sort(och);
sort(ocher);
Sort(oh);
sort(oh1);
zapis_fail(och,ocher);
vivod_fail(oh,f2);
vivod_fail(oh1,f1);
{zapis_fail(f2,t,r); }
{sort(ocher2);}
vivod_fail(ocher2,f3);
writeln('1-vii fail ');
vivod(f1);
writeln;
writeln('2-oi fail ');
vivod(f2);
writeln;
writeln('rezultat sli9ni9 2-failov ');
vivod(f3);
readkey;
end.


procedure zapis_fail<<< в этой процедуре осущствл само слияние но оно не правильное
Условие: Даны 2 файла F1 и F2(integer) произвольной длины сгенерированные из n1 и n2 элементов соответственно - в диапазоне от -500 до 500.
Цель: Создать F3 файл используя элементы из F1 и F2, отсортированные по возрастанию.
В чем подвох: Нельзя использовать сортировку.
Нужно использовать слияние.
Слияние производить очередями(динамические данные). Т.е. предварительно создать 3 очереди, (Och1, Och2) слить в och3 по возрастанию;

Просьба: Люди если нетрудно помогите решить эту задачу. У меня почемуто неполучается .
uses
crt;
type
fail=file of integer;
tlist=^list;
list=record

inf:integer;
adr:tlist;
end;
var
f1,f2,f3:fail;
ocher,ocher2,och:tlist;
t,c,k,z,i,r,l:integer;
procedure sozd(var och:tlist;x:integer);
var
temp:tlist;
begin
if och=nil then
begin
new(och);
temp:=och;
end
else
begin
temp:=och;
while temp^.adr<>nil do
temp:=temp^.adr;
new(temp^.adr);
temp:=temp^.adr;
end;
temp^.adr:=nil;
temp^.inf:=x;
end;
procedure Sort(ocha:tlist);
var
tmp,tmp1:tlist;
a:integer;
begin
new(tmp);
new(tmp1);
tmp1:=ocha;
while tmp1<>nil do
begin
tmp:=tmp1^.adr;
while tmp<>nil do
begin
if tmp^.inf<tmp1^.inf then
begin
a:=tmp^.inf;
tmp^.inf:=tmp1^.inf;
tmp1^.inf:=a
end;
tmp:=tmp^.adr
end;
tmp1:=tmp1^.adr
end
end;
procedure vivod_fail(var osh:tlist;var f:fail);
begin
rewrite(f);
while osh<>nil do
begin
Write(f,osh^.inf);
osh:=osh^.adr
end;
close(f);
end;
procedure dobav(var oh:tlist);
begin
sozd(ocher2,oh^.inf);
oh:=oh^.adr;
end;
procedure dozapis(var oha:tlist);
begin
while oha<>nil do
begin
sozd(ocher2,oha^.inf);
oha:=oha^.adr;
end;
end;
procedure proverka(var oshka1,oshka2:tlist);
begin
if oshka1<>nil then
dozapis(oshka1)
else
if oshka2<>nil then
dozapis(oshka2)
end;
procedure Sliyan(och1,och2:tlist);
begin
while (och1<>nil) and (och2<>nil) do
begin
if och1^.inf>och2^.inf then
dobav(och2)
else
dobav(och1);
end;
proverka(och1,och2)
end;
procedure sozdanie(var ochk:tlist;a:integer);
var
s:integer;
begin
for i:= 1 to a do
begin
s:=random(999)-500;
sozd(ochk,s);
end;
end;
procedure vivod(var f:fail);
var
q:integer;
begin
reset(f);
while not eof(f) do
begin
read(f,q);
write(q,' ');
end;
close(f);
end;
begin
clrscr;
randomize;
assign(f1,'fa.Tol');
assign(f2,'fat.Tol');
assign(f3,'fatik.tol');
writeln('Задайте количество элементов для 1 файла: ');
readln©;
writeln('Задайте количество элементов для 2 файла: ');
readln(t);
sozdanie(och,c);
sozdanie(ocher,t);
Sort(och);
sort(ocher);
Sliyan(och,ocher);
vivod_fail(ocher,f2);
vivod_fail(och,f1);
vivod_fail(ocher2,f3);
writeln('2 файл: ');
vivod(f1);
writeln;
writeln('2 файл:');
vivod(f2);
writeln;
writeln('3 файл:');
vivod(f3);
readkey;
end.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)