Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2013, 20:04   #1
Dikoobraz
 
Регистрация: 10.10.2012
Сообщений: 6
Печаль [Free Pascal] Сортировка списка очереди.

Задача заключается в том, что есть динамический список и нужно его отсортировать по возрастанию, но при этом нужно переставлять не значения, а сами ячейки памяти в списке.
Вот пытался сделать, но не работает.
Код:
program Sort;

uses CRT;

Type pelem=^elem;
     elem=record
          data:integer;
          next:pelem;
        end;

procedure Vvod(var beg:pelem);
var p,kon:pelem;
    dat:integer;
begin
    beg:=nil;
    kon:=nil;
    read(dat);
    if dat=0 then
    else
    new(beg);
    kon:=beg;
    beg^.data:=dat;
    kon^.next:=nil;
    read(dat);
    While dat <> 0 do
    begin
        new(p);
        kon^.next:=p; kon:=p;
        p^.data:=dat;
        p^.next:=nil;
       Read(dat);
     end;
   readln;
end;

procedure Vyvod(var p:pelem);
var pn:pelem;
begin
    pn:=p;
       while pn<>nil do
       begin
          write(pn^.data:4);
          pn:=pn^.next;
       end;
end;

procedure Sorti(var z:pelem);
var zn,n,k,kn,e,l:pelem;
i,c:integer;
begin
    If z<>nil then
       begin
          c:=1;
          e:=z;
          While e^.next <> nil do
             begin
                e:=e^.next;
                c:=c+1
             end;

       If z^.next<>nil then
       For i:=0 to c do
          begin
             zn:=z^.next;
             if z^.data > zn^.data then
                begin
                   k:=z;
                   kn:=zn;
                   k^.next:=kn^.next;
                   kn^.next:=z;
                   z:=kn;
                   zn:=k;
                   l:=z;
                 end;
                 n:=z;
                 If zn^.next <> nil then
                    begin
                       z:=z^.next;
                       zn:=zn^.next;
                          While zn<>nil do
                             If z^.data > zn^.data then
                             begin
                                k:=z;
                                kn:=zn;
                                k^.next:=kn^.next;
                                kn^.next:=z;
                                z:=kn;
                                zn:=k;
                                l^.next:=z;
                                l:=l^.next;
                                z:=z^.next;
                                zn:=zn^.next;
                             end;

                    end;
          end;
       end;
z:=n;
end;

var d:pelem;

Begin
CLRSCR;
    d:=nil;
    Vvod(d);
    Sorti(d);
    Writeln('============================');
    Vyvod(d);
end.
Dikoobraz вне форума Ответить с цитированием
Старый 25.04.2013, 20:39   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

Вообще не разбирался с кодом, но обратил внимание на
Код:
read(dat);
тут следует использовать:
Код:
readln(dat);
и вот почему:
При вводе данных с клавиатуры, а именно это делают эти процедуры, в буфере ввода при считывании процедурой read() застревает символ возврата каретки (Enter), которым завершается ввод. Следующий read() уже не работает.
Процедура readln() считывает весь код, очищая буфер ввода.
Процедура read() полезна тогда, когда надо считать данные, которые введены одной строкой и эти данные разного типа, например, текстовый файл заполнен строками данных. В этом случае несколькими командами считываем основную часть информации, а последние данные считываем процедурой readln().
Пример:
Код:
writeln('Введите в строке Год рождения, месяц, день и ФИО');
read(yyyy);
read(mm);
read(dd);
readln(FIO);

Как-то, так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 25.04.2013, 20:47   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А никого не смущает что список односторонний? Это получается при сортировке нужно обрабатывать три элемента: Текущий, предидущий и следующий.
Это что так в ТЗ сказано "Список в одну сторону"?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.04.2013, 21:33   #4
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Что то я вообще сомневаюсь что бы программа работала и без сортировки. Учитывая
Цитата:
if dat=0 then
else
new(beg);
Хотя и без этого логика кода мне не очень понятна. На раз ТС верит в него, оставим как есть.
Предложу такой код сортировки
Код:
procedure Sorti(var nach:pelem);
var
  tmp,pered,pered1,pocle,rab:pelem;
begin
  rab:=nach;
  while rab<>nil do
  begin
    tmp:=rab^.next;
    while tmp<>nil do
    begin
      if tmp^.data>rab^.data then
      begin
        pered:=nach;
        pered1:=nach;
        if rab<>nach then
          while pered^.next<>rab do pered:=pered^.next;
        while pered1^.next<>tmp do pered1:=pered1^.next;
        pocle:=tmp^.next;
        if rab^.next=tmp then
        begin
          tmp^.next:=rab;
          rab^.next:=pocle
        end
        else
        begin
          tmp^.next:=rab^.next;
          rab^.next:=pocle;
        end;
        if pered1<>rab then
          pered1^.next:=rab;
        if rab<>nach then
          pered^.next:=tmp
        else
          nach:=tmp;
        pered1:=tmp;
        tmp:=rab;
        rab:=pered1;
      end;
      tmp:=tmp^.next;
    end;
    rab:=rab^.next;
  end;
end;
Взято с просторов интернета. И сортирует по убыванию, но думаю ТС поправит если код ему подходит.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация очереди с элементами из списка Quadrelle Паскаль, Turbo Pascal, PascalABC.NET 1 20.04.2013 22:05
Как нескольким потокам брать строку из одного списка по очереди? trafbite Общие вопросы Delphi 23 12.03.2012 19:34
Сортировка Очереди методом heapsort Jigarkhwar Помощь студентам 3 13.11.2011 01:23
Сортировка очереди. [c++] Jigarkhwar Помощь студентам 8 28.09.2011 23:12
Списка. Стеки, очереди, Кольца c++ megavolt91 Помощь студентам 0 01.06.2009 20:23