Посмотрите мой код, пожалуйста!
Задача была написать сортировку слиянием для списка.
Проблема в программе: она заканчивает работу с ошибкой 216, я не могу понять почему... Так же, если посмотреть на вывод списка, он постепенно уменьшается. Куда пропадают элементы?
Что не так? Помогите, пожалуйста, найти ошибку!
Program mergelist;
uses
crt;
type
Tinf=integer;
List=^TList;
TList=record
data:TInf;
next:List;
end;
var i, l:integer;
f:text;
path:string;
dff: integer;
counter, moveCounter, n, k, i1: integer;
spis, tmp1, lastelem:List;
ch:char;
{Список}
{Процедура добавления нового элемента в односвязный список}
procedure AddElem(var spis1:List;znach1:TInf);
var
tmp:List;
begin
if spis1=nil then
begin
GetMem(spis1,sizeof(TList));
tmp:=spis1;
end
else
begin
tmp:=spis1;
while tmp^.next<>nil do
tmp:=tmp^.next;
GetMem(tmp^.next,sizeof(TList));
tmp:=tmp^.next;
end;
tmp^.next:=nil;
tmp^.data:=znach1;
end;
{процедура печати списка}
procedure Print(spis1:List);
begin
if spis1=nil then
begin
writeln('Список пуст.');
exit;
end;
while spis1<>nil do
begin
Write(spis1^.data, ' ');
spis1:=spis1^.next
end;
end;
{Сортировка}
{Процедура слияния}
function merge(priorNode1, priorNode2: list; count1, count2: integer): list;
var i:integer;
node1, node2, lastnode, temp: list;
begin
writeln('begin merge');
lastnode:=priornode1;
node1:=priornode1^.next;
node2:=priornode2^.next;
while (count1<>0) and (count2<>0) do begin
if (node1^.data <= node2^.data) then begin
lastnode:=node1;
node1:=node1^.next;
dec(count1);
end
else begin
temp:=node2^.next;
node2^.next:=node1;
lastnode^.next:=node2;
lastnode:=node2;
node2:=temp;
dec(count2);
end;
end;
if (count1 = 0) then begin
lastnode^.next:=node2;
for i:=0 to pred(count2) do
lastnode:=lastnode^.next;
end
else begin
for i:=0 to pred(count2) do
lastnode:=lastnode^.next;
lastnode^.next:=node2;
end;
merge:=lastnode;
end;
{рекурсивная сортировка}
function mergesort(priorNode: list; count: integer): list;
var
count2:integer;
priorNode2:list;
dummyNode:list;
begin
if (count=1) then begin
writeln('begin 1 mergesort');
mergesort:=priorNode^.next;
exit;
end;
count2:=count div 2;
count:=count-count2;
writeln('count ', count);
writeln('count2 ', count2);
priorNode2:=mergesort(priorNode, count);
dummyNode:=mergesort(priorNode2, count2);
mergesort:=merge (priorNode, priorNode2, count, count2);
writeln('spis');
print(spis);
end;
{запускаем сортировку}
procedure sort (fhead: list; count:integer);
begin
if (count>1) then mergesort (fHead, count);
{issorted:=true;}
end;
{программа}
begin
Spis:=nil;
clrscr;
For i1:=1 to 1 do begin
counter:=0; {счетчик сравнений}
moveCounter:=0; {счетчик перемещений}
Spis:=nil;
tmp1:=nil;
case i1 of
1: begin path:='input.txt'; n:=10 end;
end;
assign(f,path);
reset(f);
{читаем содержимое файла, записываем его в список}
while not eof(f) do begin
readln(f, dff);
AddElem(spis, dff);
end;
end;
print(spis);
writeln('--end of list--');
sort(spis, n);
print(spis);
end.