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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2009, 16:30   #1
kant1288
 
Регистрация: 24.03.2009
Сообщений: 3
По умолчанию Переворот очереди (Delphi)

Нужно сделать переворот очереди(односвязный список), то есть если очередь: 1 2 3 6, то после нажатия кнопки "переворот" должно получиться: 6 3 2 1, ещё раз нажать, снова перевернёт. Первоначально имеется вот такая процедура добавления элементов в очередь:
Код:
procedure TForm1.Button1Click(Sender: TObject);
  var t:TComp;
  begin
 new(t);
 if edit1.Text='' then showmessage('Пусто') else
 begin
 t^.d:=edit1.text;
 Memo1.Lines.Add(edit1.text);
 t^.link:=nil;
 if Last=nil then First:=t
 else Last^.link:=t;
 Last:=t;
 edit1.Text:='';
 Edit1.SetFocus();
 end;
 end;

Последний раз редактировалось Stilet; 25.03.2009 в 08:47.
kant1288 вне форума Ответить с цитированием
Старый 24.03.2009, 16:34   #2
бедный_студент
Форумчанин
 
Регистрация: 09.02.2009
Сообщений: 143
По умолчанию

вводишь 3ю переменную, потом сначала первую переменную (с одного конца) приравниваешь к 3й нововведенной, затем приравниваешь первой значение последней потом из 3й переносишь значение в последнюю делаешь так в цикле до n элементов / 2
бедный_студент вне форума Ответить с цитированием
Старый 24.03.2009, 20:13   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от бедный_студент
вводишь 3ю переменную, потом сначала первую переменную (с одного конца) приравниваешь к 3й нововведенной
это 1) неправильно с точки зрения работы со списком
2) это НЕ БУДЕТ работать - список это Вам не массив!
тут элементы ссылаются друг на друга.

kant1288, нужно менять только значение поля .link (ну и в конце обменять местами переменные Last и First)
смотрите. пусть в списке 4 элемента.
они связаны так:
T1.link -> T2 T2.link -> T3 T3.link -> T4 T4.link -> NIL
заносим в
T4.link := T3;
T3.link := T2;
T2.link := T1;
T1.link := NIL;
t := Last;
Last := First;
First := t;

всё. список уже в обратном порядке!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.03.2009, 20:27   #4
бедный_студент
Форумчанин
 
Регистрация: 09.02.2009
Сообщений: 143
По умолчанию

почему это не будет ? я же не ссылку на переменную даю а приравниваю её другой пресменной и какая собственно разница массив то же скопище переменных расположенных упорядоченно. ты что то меня не понял я вроде не мудрствовал
бедный_студент вне форума Ответить с цитированием
Старый 24.03.2009, 21:24   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да нет. Это Вы меня не поняли...
хорошо. ответьте тогда на два "простых" вопроса...

пусть у нас 4 элемента в списке (смотри пример в моём предыдущем сообщении)

вопрос 1. Как поменять местами 2 и 3й элементы?
Напишите код замены. Особенно прошу обратить внимание на момент получения адресов 2-го и 3-го элементов...

вопрос 2. в первом элементе у нас ссылка, которая указывает на второй элемент списка.
После замены местами первого и последнего элемента, куда будет показывать ссылка?!
ой.. тут я, кажется, понял...
Вы предлагаете заменить в элементах списка только собственно содержимое (данные - в данном случае строковые данные, находящиеся в поле .D) и не трогать ссылки (.link) элементов?!!!

в этом случае, второй вопрос отпадает.
Но на месте преподавателя я бы такой вариант точно зарезал! Как противоречащий самой идее работы с динамическими списками!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2009, 08:48   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что за проблема вместо переворота просто считывать их с конца?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.03.2009, 09:30   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А что за проблема вместо переворота просто считывать их с конца?
ну, это:
пункт 1) противоречит условиям задачи (там же просят не вывести в обратном порядке, а именно перевернуть очередь... может быть, с этой перевёрнутой очередью будут выполняться какие-то операции.. ну слияние с другой очередью, например... или её что-то... )

2) вывести односвязный список в обратном порядке задача достаточно ресурсоёмкая! Дело в том, что по последнему элементу нельзя получить предпоследний.
по предпоследнему - предпредпоследний..
я понимаю, что можно проходить всё очередь от начала, до i-го элемента, каждый раз уменьшая i
но это неэффективно, некрасиво и неверно (см. пункт 1)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.03.2009, 21:37   #8
kant1288
 
Регистрация: 24.03.2009
Сообщений: 3
По умолчанию

Спасибо большое
kant1288 вне форума Ответить с цитированием
Старый 26.03.2009, 21:38   #9
kant1288
 
Регистрация: 24.03.2009
Сообщений: 3
По умолчанию

за помощь..
kant1288 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод записей очереди ... counter Общие вопросы C/C++ 2 19.03.2012 12:43
Скачка файлов из инета по очереди koyotfgthispass Работа с сетью в Delphi 17 24.12.2008 17:50
Запуск экзешников по очереди Airou Общие вопросы Delphi 2 03.09.2008 21:15
переворот числа! помогите плиззз Devil Помощь студентам 5 03.04.2007 19:16