1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задача была написать сортировку слиянием для списка. Проблема в программе: она заканчивает работу с ошибкой 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);