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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2011, 21:54   #1
Bottane4ka
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 10
По умолчанию Сортировка списка. Указатели. (Delphi)

Добрый вечер.
Задали сделать программу по спискам с указателями.
Задание:
Даны натуральное число n, действительные числа a1,…, an. Если последовательность a1,…, an упорядочена по неубыванию (т. е. если a1<=a2<=…,<=an), то оставить ее без изменения. Иначе получить последовательность an,…, a1.
Использовать стек.

Сама смогла только создать список, как его сортировать не понимаю.
Код:
program Projectspiski;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type Tptr=^TElem;
     TElem=record
       dan:integer;
       next:Tptr;
     end;
     TList = record
  first, last: Tptr;
end;

//запись данных в стек
procedure push(var top:Tptr);
  var p:Tptr;
begin
  randomize;
  new(p);
  p^.dan:=random(100);
  p^.next:=top;
  top:=p;
end;

//Элемент
procedure pop(var top:TPtr; var value:integer);
  var p:Tptr;
begin
  value:=top^.dan;
  p:=top;
  top:=p^.next;
end;

//Удаление
procedure delstek(top:Tptr);
  var p:Tptr;
begin
   while top<>nil do
     begin
       p:=top;
       top:=p^.next;
       dispose(p);
     end;
end;


 var n,i,k:integer;
      top1,top2,tek:Tptr;
      flag:boolean;
begin
  readln(n);
  top1:=nil;
  for i:=1 to n do push(top1);
  tek:=top1;
  writeln('_____________________');
  while tek<>nil do
    begin
      pop(tek,k);
      write(k,' ');
    end;
  delstek(top1);
  readln;
end.
Буду очень признательна за любую помощь
Bottane4ka вне форума Ответить с цитированием
Старый 21.12.2011, 22:31   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Замечание: Список - это не стек.
Вот тут во вложении есть отсканированный фрагмент программы для работы со списком (Т.А. Павловская, Программирование на ЯВУ, Паскаль)
К сожалению тут нет сортировки.
Вложения
Тип файла: rar 1.rar (218.9 Кб, 26 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 21.12.2011, 22:59   #3
Bottane4ka
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 10
По умолчанию

Тогда что означает вот этот рисунок?
На лекциях нам говорили, что так работает стек. Тогда для чего вообще он нарисован в задании?
Bottane4ka вне форума Ответить с цитированием
Старый 22.12.2011, 10:44   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Bottane4ka, сортировка (любыми способами) сводится в конце концов к тому, что элементы особым образом меняют свое местоположение относительно друг друга (меняются местами).

В случае списка допустимы разные способы решения задачи:
когда мы сравнили между собой два элемента и один из них больше (или меньше - в зависимости от сортировки по возрастанию или убыванию), то надо их поменять местами.
если расматривать элементы списка как элементы некоторого "массива", тогда, можно поменять местами информационную часть (не трогая указатели) - в вашем случае это поменять местами содержимое полей dan

второй способ. Он более сложный (алгоритмически). Но, боюсь, что именно его реализацию ждут от Вас. Когда мы сравнили два элемента и обнаружили, что их нужно поменять местами, то сами элементы оставляем на своих местах, а изменяем только ссылки на них таким образом, чтобы элементы поменялись местами В ПОСЛЕДОВАТЕЛЬНОСТИ...

Цитата:
Тогда что означает вот этот рисунок?
а странички из книжки в тему. Именно так и представляется динамический односвязный список.

Последний раз редактировалось Serge_Bliznykov; 22.12.2011 в 10:47.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.12.2011, 15:11   #5
Bottane4ka
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 10
По умолчанию

А то, что я уже написала ранее является верным? Можно продолжить решать задачу с этим кодом?
Bottane4ka вне форума Ответить с цитированием
Старый 22.12.2011, 15:31   #6
Bottane4ka
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 10
По умолчанию

Еще я не совсем понимаю как сравнивать два элемента списка...
Два элемента массива я понимаю - через for
А как сравнить два элемента списка?
как то так?
Код:
if top.dan>top.next.dan then
Bottane4ka вне форума Ответить с цитированием
Старый 22.12.2011, 17:36   #7
Bottane4ka
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 10
По умолчанию

Вот не без помощи интернета написала вот это:
Код:
program Projectspiski;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
  Tptr = ^Telem;
  Telem = record
    dan:integer;
    next:Tptr;
  end;

procedure Input(var top:Tptr);
  var t:Tptr;
begin
  randomize;
  New(t);
  t^.dan:=random(10);
  if top<>nil then
    begin
      t^.next:=top^.next;
      top^.next:=t;
    end
  else
    begin
      top:=t;
      top^.next := nil;
    end;
end;

procedure Print(top:Tptr);
begin
  while top<>nil do
    begin
      write(top^.dan, ' ');
      top:=top^.next;
    end;
  writeln;
end;

Procedure ClearSpisok(var top:Tptr);
  var t:Tptr;
begin
  while top<>nil do
    begin
      t:=top;
      top:=top^.next;
      Dispose(t);
    end;
end;

Function SortSpisok(top: Tptr): Tptr;
var newh, cur, sel: Tptr;
begin
  newh:=nil;
  while top<>nil do
    begin
      sel:=top;
      top:=top^.next;
      if (newh=nil) or (sel^.dan<>newh^.dan) then
        begin
          sel^.next:=newh;
          newh:=sel;
        end
      else
        begin
          cur:=newh;
          while (cur^.next<>nil) and (cur^.next^.dan<>sel^.dan) do cur:=cur^.next;
          sel^.next:=cur^.next;
          cur^.next:=sel;
        end;
    end;
  SortSpisok:=newh;
end;

var
  top1:Tptr;
  i,n:integer;
begin
  readln(n);
  top1:= nil;
  for i := 1 to n do Input(top1);
  Print(top1);
  top1:= SortSpisok(top1);
  Print(top1);
  ClearSpisok(top1);
  readln;
end.
Программа упорядочивает список как надо в задании.
Осталось только узнать ответ на предыдущий вопрос: "А как сравнить два элемента списка?"
Bottane4ka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка динамического списка | Delphi Chloe Помощь студентам 2 15.07.2011 13:09
Сортировка списка 4ika Общие вопросы C/C++ 3 27.11.2009 20:38
Сортировка списка [MI_nor] Общие вопросы C/C++ 10 05.05.2009 23:52
Сортировка списка Рамик Помощь студентам 4 11.03.2009 14:01
Сортировка списка... Arkuz Компоненты Delphi 4 03.05.2008 23:21