Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 12.10.2009, 23:47   #1
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость Сортировка динамической структуры

Дин. структура представлена типом с полями и указателем
[/CODE]

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
   const
   n=5;
  type
     per=^person;
     person=record
      age:integer;
      next:per;
     end;


 var
 G:array of person;
 i,D:integer;
 L,first:per;



begin




   SetLength(G,N);
   g[0].age:=11;
   g[1].age:=2;
   g[2].age:=8;
   g[3].age:=7;
   g[4].age:=19;


 New(L);
 First:=L;

         for i := 0 to 4 do
         begin
            L^.age:=g[i].age;

                if I<N then
                   begin
                         New(L^.Next);
                         L:=L^.Next;
                   end;

          end;


L^.Next:=First;

                  for i:=1 to n do
              begin

                 write(L^.age, ' ');
                 L:=L^.next;

              end;                // Выводит все норм


    
 // Пытался сделать сортировку дин структуры "пузырьком", но я предполагаю , что  тут ерунда с переадрасацией
    while L^.next<>nil do
       begin
           if L^.age>L^.next^.age then
              begin
              D:=L^.age;                                     
 
              L^.age:=L^.next^.age;
              L^.next^.age:=D;
              end;

          L:=L^.next;

       end;


end.
Тойсть алгоритм я понимаю, а вот толком реализовать не могу...
Тойсть как с массивом:
Код:
var i,j:integer;
    begin
   for i:=0 to Length(G)-1 do
    for j:=i+1 to Length(G)-1 do
    begin
      if G[i].KodCycl>G[j].KodCycl then
      begin
        P:=G[i];
        G[i]:=G[j];
        G[j]:=P;
      end;
    end;
только перевести это на динамический лад...

Последний раз редактировалось Lemo; 13.10.2009 в 16:03.
Lemo вне форума Ответить с цитированием
Старый 13.10.2009, 16:41   #2
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

Кто то что ответит? Тема засыхает =(
Lemo вне форума Ответить с цитированием
Старый 13.10.2009, 16:49   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
    while L^.next<>nil do
       begin
           if L^.age>L^.next^.age then // Тут сравнивается текущий элемент со следующим
              begin
              D:=L^.age;                                     
 
              L^.age:=L^.next^.age;
              L^.next^.age:=D;
              end;

          L:=L^.next;

       end;
А нужно сравнивать нужно какой-то один с каждым.
То есть сначала первый со всеми остальными, потом второй и т.д.
Исправьте это и тогда всё должно быть пучком
Заведите второй указатель, который будет ездить по списку, пока первый будет указывать на первый/второй/третий... элемент
netrino вне форума Ответить с цитированием
Старый 13.10.2009, 16:50   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

я не понял зачем здесь указатели если у вас простой массив
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.10.2009, 17:06   #5
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

2Пепел Феникса
Да вот имено, просто проходим тему с этим "хорошими" указателями и нужно имено в динам виде отсортировать...
2netrino
Я тоже примерно понимаю что нужно еще 1 цикл впихнуть, но не могу норм сформулировать условие...Был бы признателен если ты накинул 2-й цикл...
Lemo вне форума Ответить с цитированием
Старый 13.10.2009, 17:29   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Дело ещё в том, что суть обмена у Вас неправильна... Вы меняете возраст, а не персон. То есть выходит, если у первой персоны возраст больше, чем у второй, то по этому алгоритму просто присваивается возраст первой персоны второй ) Думаю от вас не этого требовали...
netrino вне форума Ответить с цитированием
Старый 13.10.2009, 18:01   #7
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

Стуктура я сам выдумал, тут не важно "возраст" это или нет, главное отсортировать по увеличению....
Lemo вне форума Ответить с цитированием
Старый 13.10.2009, 18:58   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ааа) ну раз так, то вот исправленный код, у меня работает, вроде:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
   const
   n=5;
  type
     per=^person;
     person=record
      age:integer;
      next:per;
     end;


var
   G:array of person;
   i,D:integer;
   L, R, first:per;

begin
   SetLength(G,N);
   g[0].age:=11;
   g[1].age:=2;
   g[2].age:=8;
   g[3].age:=7;
   g[4].age:=19;


   New(L);
   First:=L;

   for i := 0 to 4 do
   begin
      L^.age:=g[i].age;

      if I<N then
      begin
         New(L^.Next);
         L:=L^.Next;
      end;

   end;


   L := First;

   for i:=1 to n do
   begin
      write(L^.age, ' ');
      L:=L^.next;

   end;

   L := First;

   while L^.next<>nil do
   begin
      R := L^.next;
      while R^.next <> nil do
      begin
         if L^.age > R^.age then
         begin
            D:=L^.age;
            L^.age := R^.age;
            R^.age := D;
         end;
         R := R^.next;
      end;
      L := L^.next;
   end;

   L := First;
   writeln;

   for i := 1 to n do
   begin
      write(L^.age, ' ');
      L := L^.next;
   end;

   readln;

end.
Там по ходу ещё пара ошибок была, Вы иной раз забывали инициализировать L первым элементом
netrino вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка структуры vo_sa Общие вопросы C/C++ 1 25.06.2009 14:16
структуры. не получается сортировка. grewnica Общие вопросы C/C++ 2 12.05.2009 14:49
Структуры. Сортировка по фамилии студента. STS_1991 Помощь студентам 3 09.05.2009 12:14
Паскаль: шейкерная сортировка на динамической структуре. kotzebu Фриланс 1 01.05.2009 12:48
Сохранение в файл сложной динамической структуры _Инженер_ Общие вопросы Delphi 24 20.10.2008 09:38