Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кольцевой список в обратном порядке, вывод списка наоборот 
:(
    Опции темы
helflip
  Дата 21.11.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 14.5.2006
Где: Moscow

Репутация: нет
Всего: 4



Всем привет
Подскажите как вывести кольцевой список в обратном порядке? Вот мой код процедуры вывода нет вообще не знаю как ее делать smile 
Заранее благодарю!smile
Код

program P1;
Uses Crt;
        type
            te=Integer;
            pe = ^el;
            el = Record
               inf:te;
               next:pe;
            End;

        Var
           saq:pe;
           menu: byte;


Procedure NewLos(var saq:pe);
var q:pe; a:te; i:te;
Begin
clrscr;
  New(saq);
  q:=saq;
  q^.next:=nil;
  writeln('Procedura Vvoda LOS.');
  writeln('Dlya vihoda vvedite 0 i nazmite Enter.');
  write('Vvedite 1-ii element LOS:');
  readln(a);
  i:=2;
  while a<>0 Do
    Begin
      write('Vvedite ',i,'-ii element LOS:');
      new(q^.next);
      q:=q^.next;
      q^.inf:=a;
      q^.next:=nil;
      readln(a);
      i:=i+1;
    end;
   q^.next:=saq^.next;
end;

Procedure ReversOutput(var saq:pe);
var q:pe;
Begin
clrscr;
  {-----Чего тут писать?------}
end;

Procedure Output(var saq:pe);
var q:pe;
Begin
clrscr;
  if saq = nil then
   begin
    writeln('Press any key for Exit');
    writeln('LOS Pustoi!!!');
    Repeat Until KeyPressed;
   end
  else
   begin
    q:=saq^.next;
    writeln('Vvedennii LOS');
    writeln('Press any key for Exit');
    Repeat
     While q<>saq Do
      Begin
       Write(q^.inf);
       write(' - ');
       q:=q^.next;
      end;
    Until KeyPressed;
   end;
end;

--------------------
 
PM MAIL   Вверх
volvo877
Дата 21.11.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 9
Всего: 116



Цитата(helflip @  21.11.2008,  14:55 Найти цитируемый пост)
Подскажите как вывести кольцевой список в обратном порядке?
Ты сначала заполни список правильно, и научись его выводить в прямом порядке, а потом будешь браться за обратный..

Вот так примерно:
Код
program P1;
Uses Crt;

type
  te = Integer;
  pe = ^el;
  el = record
    inf: te;
    next:pe;
  end;

{
Var
  menu: byte;
}

procedure AddNode(var root: pe; X: integer);
var
  T1, T2: pe;
begin
  if root = nil then begin
    new(root);
    root^.inf := X;
    root^.next := root;
    exit;
  end;

  new(T1);
  T2 := root;
  while T2^.next <> root do T2 := T2^.next;
  T1^.next := root;
  T2^.next := T1;
  T1^.inf := X;
end;

Procedure CreateRing(var root: pe);
var a, i: te;
Begin
  clrscr;
  writeln('Procedura Vvoda LOS.');
  writeln('Dlya vihoda vvedite 0 i nazmite Enter.');
  i := 1;
  repeat
    write('Vvedite ', i, '-ii element LOS:'); ReadLn(a);
    if a <> 0 then AddNode(root, a);
  until a = 0;
end;

procedure Output(root: pe);
var T: pe;
begin
  if root = nil then begin
    writeLn('Ring is empty!'); exit;
  end;
  T := root;

  repeat
    write(T^.inf:5);
    T := T^.next;
  until T = root;
  writeln;
end;

procedure ReverseOutput(root: pe);

  procedure reverse(R: pe);
  begin
    if R^.next <> root then reverse(R^.next);
    write(R^.inf:5);
  end;

begin
  if (root = nil) then begin
    writeln('Ring is empty'); exit
  end;
  reverse(root);
  writeln;
end;


var
  root: pe;

begin
  root := nil;
  CreateRing(root);
  output(root);
  reverseoutput(root);
end.

PM MAIL   Вверх
bems
Дата 21.11.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



а если нужно быстрее и позволительно увеличить требования к памяти, то в запись элемента списка добавляешь указатель на предыдущий элемент и вывод в обратном порядке будет выглядеть так же как и в прямом, только вместо next для перехода используй prev


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dobermann
Дата 21.11.2008, 19:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Цитата(bems @  21.11.2008,  19:14 Найти цитируемый пост)
только вместо next для перехода используй prev

Т.е. от имени переменной зависит порядок вывода?  smile 
PM   Вверх
bems
Дата 21.11.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Dobermann, тебе действительно не понятно о чем я или ты прикидываешся?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
helflip
Дата 4.12.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 14.5.2006
Где: Moscow

Репутация: нет
Всего: 4



Спасибо! Она работает конечно, но я что-то все равно не понял рекурсию!:(

Что вот тут происходит и что за указатель R? Откуда он берется и что в его инф части?

Код

procedure reverse(R: pe);
  begin
    if R^.next <> root then reverse(R^.next);
    write(R^.inf:5);
  end;


Посмотрите правильно я коменты написал
Код

procedure AddNode(var saq: pe; X: real);
var
  T1, T2: pe;//2 доп-х указателя
begin

//Если КОС пустой добавляем первый элемент
//-------------НАЧАЛО----------------
  if root = nil then begin
    new(root);
    saq^.inf := X;
    saq^.next := root;
    exit; // Выходим из основной процедуры
  end;
//-------------КОНЕЦ--------------
  new(T1);//Выделяем память под T1
  T2 := root ;
  while T2^.next <> root do //пока адрес следующего элемента за T2 не равен заголовку
  T2 := T2^.next;// переходим к следующему элементу
  T1^.next := root;// замыкаем Т1 на заголовок
  T2^.next := T1;// //следующий за Т2 приравниваем Т1
  T1^.inf := X; //в инф часть Т1 засовываем введенное число
end;

--------------------
 
PM MAIL   Вверх
helflip
Дата 4.12.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 14.5.2006
Где: Moscow

Репутация: нет
Всего: 4



Цитата(helflip @  4.12.2008,  15:14 Найти цитируемый пост)
Что вот тут происходит и что за указатель R? Откуда он берется и что в его инф части?

Сори туплю! R я понял откуда это же мы заголовок передаем! А в рекурсии фигарим в стек все пока не пройдем кольцо, а когда пройдем фигарим все из стека, как раз задом наперед!
--------------------
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.