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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2008, 13:48   #1
Loginanton
 
Регистрация: 26.12.2008
Сообщений: 4
По умолчанию Ошибка в сортировке линейного списка, помогите пожалуйста найти

Вот код моей программы:
Код:
program test;
type
    aaa = ^bbb;
    bbb = record
        st : string;
        next : aaa;
        prev : aaa;
        sort : aaa;
        end; { end of record }
var
    a , root , head , tmp : aaa;
    f : text;
    n , i , j : byte;
procedure p1;
begin
          assign(f, 'F1.txt');
          reset(f);
    new(a);
    root := a;
    a^.prev := nil;
    n := 0;
    while not eof(f) do begin
        readln(f, a^.st);
        n := n + 1;
        new(a^.next);
                    a^.sort := a^.next;
        a^.next^.prev := a;
        a := a^.next;
        end;
    head := a^.prev;
    a := nil;
    a := root;
          close(f);
    writeln('Количество строк в файле: ', n);
          for i := (n - 1) downto 1 do begin
           for j := 1 to i do begin
                     if length(a^.st) > length(a^.sort^.st) then begin
                               a^.sort^.sort^.prev := a;
                                        tmp := a^.sort^.sort; { ! }
                                        a^.sort^.sort := a;
                                        a^.sort^.prev := a^.prev;
                                        a^.prev^.sort := a^.sort;
                                        a^.prev := a^.sort;
                                        a^.sort := tmp;
                               end; { end if }
                              a := a^.sort;
                              end; { end for }
                    a := root;
                    end; { end for }
          while a^.sort <> nil do begin
           writeln(a^.st);
                    a := a^.sort;
                    end; { end while }
end; { end of p1 }
begin
p1;
readln;
end. { end of program }
Ошибка точно в месте где два элемента списка меняются местами, просто менять местами значения a^.st нельзя - задание не позволяет. Помогите найти ошибку пожалуйста, заранее благодарен.
Loginanton вне форума Ответить с цитированием
Старый 31.12.2008, 14:42   #2
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Мой вариант сортировки - может поможет :

Код:
program exe;
type
 s = string[12];
 PComp = ^Comp;
 Comp =     record
             data : s;
             next : PComp
            end;
var
 Pbeg, Pend, THIS : PComp;
 line : s;
 count : word;
 f1 : text;
begin
  assign (f1, 'f1.txt');
  reset (f1);

  while not EOF(f1) do
  begin
    readln (f1, line);
    if Pbeg=nil then
    begin
      new (Pbeg);
      Pbeg^.data:=line;
      Pbeg^.next:=nil;
      Pend:=Pbeg
    end
    else
    begin
      new (Pend^.next);
      Pend:=Pend^.next;
      Pend^.data:=line;
      Pend^.next:=nil
    end
  end;
  repeat
    Pend:=Pbeg;
    count:=0;
    repeat
      if (Pend=Pbeg) and (Pend^.data > Pend^.next^.data) then
      begin
        Pbeg:=Pend^.next;
        Pend^.next:=Pbeg^.next;
        Pbeg^.next:=Pend;
        count:=count+1
      end;
      if Pend^.next^.data > Pend^.next^.next^.data then
      begin
        THIS:=Pend^.next^.next;
        Pend^.next^.next:=THIS^.next;
        THIS^.next:=Pend^.next;
        Pend^.next:=THIS;
        count:=count+1;
      end;
      Pend:=Pend^.next
    until Pend^.next^.next=nil;
  until count=0;
  Pend:=Pbeg;
  while Pend<>nil do
  begin
    writeln (Pend^.data);
    Pend:=Pend^.next
  end;

readln

end.
В общем сортровка для 4 и более элементов - нет времени переделывать ее - ну там потому что однонаправленный список, поэтому проверки жесткие ну в общем держи - не забудь про отзыв
capta1n вне форума Ответить с цитированием
Старый 31.12.2008, 15:01   #3
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

как то сложно написано в первой проге: a^.next^.prev := a; можно использовать второй указатель:
Код:
new(a^.next);
root:=a;
a:=a^.next;
a^.prev:=root
Викдон вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная реализация однонаправленного линейного списка Денис Ст Помощь студентам 2 14.01.2014 21:50
Сортировка линейного списка, реализованного двумя массивами coptor Общие вопросы Delphi 1 28.11.2008 18:45
Сортировка линейного списка. ТИВ Паскаль, Turbo Pascal, PascalABC.NET 3 23.11.2008 22:39
[Turbo Pascal] Помогите найти ошибку в сортировке, пожалуйста. Pork6 Помощь студентам 3 08.10.2008 21:29