Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 88
от 21.10.2005, 14:21

Администратор:Калашников О.А.
В рассылке:Подписчиков: 144, Экспертов: 41
В номере:Вопросов: 1, Ответов: 2


Вопрос № 27789: Здравствуйте уважаемые эксперты. Помогите, пожалуйста, разобраться с задачей: создать двусвязанный список из целых чисел. Преобразовать его в кольцо. Предусмотреть возможность движения по кольцу в обе стороны с отображением местоположения текущег...

Вопрос № 27.789
Здравствуйте уважаемые эксперты.
Помогите, пожалуйста, разобраться с задачей: создать двусвязанный список из целых чисел. Преобразовать его в кольцо. Предусмотреть возможность движения по кольцу в обе стороны с отображением местоположения текущего элемента.

Пользуясь материалом из FAQ и форумов я создал кольцо и написал процедуры движения. Пытался создать двусвязанный список (процедура add в комментариях). Но окончательно запутался. Как правильно создать двусвязанный список (применительно к моей задаче) и главное, КАК ПРЕОБРАЗОВАТЬ ЕГО В КОЛЬЦО?

program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;

type TipElement=Integer;
svqz=^Zveno;
Zveno=Record
sled:svqz;
pred:svqz;
element:TipElement;
end;

var
Ring:svqz;
p,l:svqz;

{procedure add(x:integer; var l:svqz);
//var
//p:svqz;
begin
p:=new(svqz);
p^.element :=x;
if (l^.sled =nil) then {dobavlyaem element v konets spiska}
{begin
l^.sled:=p;
p^.pred:=l;
p^.sled :=nil;
end
else {vstavlyaem element mezhdu dvumya}
{begin
p^.sled :=l^.sled ;
l^.sled^.pred :=p;
p^.pred:=l;
l^.sled:=p;
end;
end;}

{**************************************************************}
procedure Postroenie_ring(var ring:svqz);
var
q:svqz;
elem:TipElement;
begin
new(ring);
ring^.sled:=ring;
ring^.pred:=ring;

writeln ('Vvodite elementi kolca (okonchanie vvoda - 0): ');
read(elem);
write(' ');

while elem<>0 do
begin
new(q);
q^.element:=elem;
q^.sled:=Ring^.pred^.sled;
q^.pred:=ring^.pred;
ring^.pred^.sled:=q;
ring^.pred :=q;

read (elem);
write(' ');
end;
writeln
//end;
end;
{******************************************************************}

procedure vyvod_forward(ring:svqz);
var ukzv:svqz;
begin
ukzv:=ring^.sled;
if ring^.sled =ring then
writeln('Kolco pysto')
else
begin
while ukzv<>ring do
begin
write(ukzv^.element, ' ');
ukzv:=ukzv^.sled;
end;
writeln;
end;
end;

procedure vyvod_back(ring:svqz);
var
ukzv:svqz;
begin
ukzv:=ring^.pred;
if ring^.sled=ring then
writeln('Kolco pysto')
else
begin
while ukzv<>ring do
begin
write(ukzv^.element, ' ');
ukzv:=ukzv^.pred;
end;
writeln;
end;
end;

//Var
//l:svpz;
Begin
{l:=nil;
l:=new(svqz);
l^.sled:=nil;
l^.pred :=nil;
l^.element:=0;

add(7,l);
add(5,l); }

Postroenie_ring (ring);
writeln('Vyvod elementov v pryamom i obratnom poryadke...');
vyvod_forward(ring);
vyvod_back(ring);

readln;
readln;
//readln;
End.

Для написания использовался Delphi (Console Application).
Отправлен: 16.10.2005, 14:19
Вопрос задал: Martin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Вiктор
Здравствуйте, Martin!
Простите, не вникал в ваш код
насколько я помню, двусвязный список - когда каждый элемент имеет две ссылки - на предыдущий и прошлый элемент.
а кольцо - когда у самого последнего ссылка "след" указывает на первого, а у первого ссылка "пред" указывает на последнего. Вот и кольцо.

сначала нужно какой-то указатель на элемент, чтобы вообще можно было зайти в кольцо
далее: 1-й элемент - у него нач. и пред. элементы- это он сам.
добавление:
взять 1-й элемент, узнать кто 2-й; 2-му поставить что у него предыдущий не 1-й, а добавляемый.
1-му поставить что у него след.ел=добавляемый, а не 2-й
добавляемому элементу сделать чтобы пред=1-й, след=2-й.
вот и добавили. И сразу всё в кольце

а номер эл-та - можно попробовать давать номер относительно того, где вход в кольцо.

Надеюсь понятно выразился.
Удачи!

---------
BUGи ловить, ловить и ловить. А потом дописать код - и всё с начала...
Ответ отправил: Вiктор (статус: 5-ый класс)
Отправлен: 16.10.2005, 14:55
Оценка за ответ: 4

Отвечает: sir henry
Здравствуйте, Martin!
Начнем с конца. :)
Преобразование в кольцо нужно делать, когда список уже весь заполнен, иначе нет смысла его закольцовывать. :) Кольцо делается присвоением указателя на следующий элемент последнего элемента списка на начальный элемент списка, а указатель на предыдущий элемент первого элемента указывает на последний элемент.
Поскольку в двусвязном списке добавлять элемент можно как в конец списка, так и в начало, то можно создать две отдельные процедуры добавления. Реализацию см в приложении.

Приложение:

Ответ отправил: sir henry (статус: Профессор)
Отправлен: 16.10.2005, 16:44
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Rambler's Top100 Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.pasplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное