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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2011, 01:10   #1
sunny_alice
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 46
Смущение Не работает самодельная сортировка (связанные списки)

Программа с динамическими данными - связанные списки.
Не работает конкретно сортировка. Я сама написала алгоритм, но считает программа неправильно. Проверила вручную на бумажке - все правильно считает. Короче, задание такое:
Упорядочить по возрастанию только элементы с четными номерами в списке.

Код:
program lab6_3;
  uses crt;
  const n=10;
  type tptr=^telem;
       tinf=integer;
       telem=record
                   inf:tinf;
                   link:tptr;
             end;
      mas=array[1..n] of integer;
  var stackhead:tptr;
      i,n1:integer;
      p:^mas;

  procedure pushdown(var stack:tptr; inf:tinf);
    var p:tptr;
  begin
    new(p);
    p^.inf:=inf;
    p^.link:=stack;
    stack:=p;
  end;

  procedure popup(var stack:tptr; var inf:tinf);
    var p:tptr;
  begin
    p:=stack;
    inf:=p^.inf;
    stack:=p^.link;
    dispose(p);
  end;


  procedure obrab;
    var i,j,n1,r,y:integer;
        stackhead:TPTR;
        p:^mas;
  begin
    new(p);
    i:=1;
    stackhead:=nil;
    for i:=1 to n do
      begin
        write('p[',i,']=');
        readln(p^[i]);
        pushdown(stackhead,p^[i]);
      end;

    n1:=0;
    while stackhead<>nil do
      begin
        inc(n1);
        popup(stackhead,p^[n1]);
      end;

    i:=4;
    while i<>(n+2) do
      begin
        j:=n;
        while j<>2 do
          begin
            if p^[j-2]>p^[j] then
              begin
                y:=p^[j-2];
                p^[j-2]:=p^[j];
                p^[j]:=y;
              end;
            j:=j-2;
          end;
        i:=i+2;
      end;

    for i:=1 to n1 do
      write(p^[i],' ');
    dispose(p);
    readln;
  end;

begin
  clrscr;
  obrab;
  readln;
end.

Ввожу для проверки массив: 7 3 1 5 6 8 2 1 5 4
Должно в итоге получиться: 7 1 1 3 6 4 2 5 5 8
Вручную получилось, программа выдает 4 1 1 2 8 5 5 6 3 7

Заранее спасибо за помощь
sunny_alice вне форума Ответить с цитированием
Старый 28.05.2011, 11:37   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Если не секрет, а зачем вам нужны процедуры pushdown и popup? Они напоминают мне реализацию работы стека(в итоге получается инвертированный массив). Вам это нужно? Если нет - убирайте их. Кроме того, зачем изобретать какой то свой метод сортировки. Воспользуйтесь уже готовым. Например так
Код:
 const n=10;
  type tptr=^telem;
       tinf=integer;
       telem=record
                   inf:tinf;
                   link:tptr;
             end;
      mas=array[1..n] of integer;
  var stackhead:tptr;
      i,n1:integer;
      p:^mas;

  procedure pushdown(var stack:tptr; inf:tinf);
    var p:tptr;
  begin
    new(p);
    p^.inf:=inf;
    p^.link:=stack;
    stack:=p;
  end;

  procedure popup(var stack:tptr; var inf:tinf);
    var p:tptr;
  begin
    p:=stack;
    inf:=p^.inf;
    stack:=p^.link;
    dispose(p);
  end;


  procedure obrab;
    var i,j,n1,r,y:integer;
        stackhead:TPTR;
        p:^mas;
        Obmen:Boolean;
  begin
    new(p);
    i:=1;
    stackhead:=nil;
    for i:=1 to n do
      begin
        write('p[',i,']=');
        readln(p^[i]);
      end;
    n1:=10;
    //начинаем сортировку
    Repeat
      Obmen:=False;
      For i:=1 to n1-1 do
      If i mod 2 = 0 then
      If p^[i] > p^[i+2] then
      Begin
        y:=p^[i];
        p^[i]:=p^[i+2];
        p^[i+2]:=y;
        Obmen:=True
      End;
      dec(n1)
    Until Not Obmen;
    n1:=10;
    for i:=1 to n1 do
      write(p^[i],' ');
    dispose(p);
    readln;
  end;
begin
  obrab;
  readln;
End.
P.s. Процедуры оставил, но нигде их не использовал.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681

Последний раз редактировалось GetMax; 28.05.2011 в 11:41.
GetMax вне форума Ответить с цитированием
Старый 28.05.2011, 18:29   #3
sunny_alice
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 46
По умолчанию

GetMax, точно! я совсем забыла, что инвертируется массив( Изменила кое-что, теперь все работает как нужно, спасибо =)
Суть программы - в использовании работы со стеком, так что popup и pushdown обязательны.
sunny_alice вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
связанные списки nikulia Microsoft Office Excel 4 20.02.2011 23:56
Связанные списки. С++ S1av0k Общие вопросы C/C++ 1 21.10.2010 23:08
Связанные списки Shoosh Общие вопросы C/C++ 11 02.10.2010 16:24
Связанные списки Лешка Помощь студентам 1 30.09.2010 21:31
связанные списки Proger_1 Общие вопросы C/C++ 1 28.05.2010 22:11