IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

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

> Сортировка списка слиянием.
ohad
сообщение 17.05.2014 21:59
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Мужской

Репутация: -  0  +


Добрый вечер, уважаемые форумчане!
Посмотрите мой код, пожалуйста!

Задача была написать сортировку слиянием для списка.
Проблема в программе: она заканчивает работу с ошибкой 216, я не могу понять почему... Так же, если посмотреть на вывод списка, он постепенно уменьшается. Куда пропадают элементы?sad.gif
Что не так? Помогите, пожалуйста, найти ошибку!


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 26.07.2025 17:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"