Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Двунаправленный список (Pascal)

41K
19 ноября 2009 года
oshilan
24 / / 15.11.2009
"Создать двунаправленный список и разместить в нём в определённом порядке данные о колоде карт. Разработать программу, проводящую перемешивание колоды путём сдвига и перестановки её частей, результаты перемешивания вывести на экран". Спасибо за внимание!
41K
21 ноября 2009 года
oshilan
24 / / 15.11.2009
Вот с чего я начал: создал все элементы карт (вес карты и её масть) и разместил это в динамической памяти. Но проблема вот в чём: вес карты- это тип string, а её масть- char. Но вроде бы тип record (запись) поддерживает разные типы внутри себя. Так вот, сейчас, например, 6♥ -это 2 типа (строчный и символьный). Подскажите, как мне сделать, чтобы 6♥ был одним типом (record), чтобы я мог использовать 6♥ (перемещать) по списку. Ну чтобы у 6♥ был один адрес (указатель), а не два, как сейчас.

Мой исходный код (результат во вложении):
Код:
program lab12;
var
    ch,bu,tr,pi: ^char;
    six,sev,eig,nin,ten,J,Q,K,A: ^string;
begin
new(six);
new(sev);
new(eig);
new(nin);
new(ten);
new(J);
new(Q);
new(K);
new(A);
new(ch);
new(bu);
new(tr);
new(pi);
six^:='6';
sev^:='7';
eig^:='8';
nin^:='9';
ten^:='10';
J^:='J';
Q^:='Q';
K^:='K';
A^:='A';
ch^:=#3;
bu^:=#4;
tr^:=#5;
pi^:=#6;
write(six^,ch^,' ',six^,bu^,' ',six^,tr^,' ',six^, pi^,' ');
write(sev^,ch^,' ',sev^,bu^,' ',sev^,tr^,' ',sev^, pi^,' ');
write(eig^,ch^,' ',eig^,bu^,' ',eig^,tr^,' ',eig^, pi^,' ');
write(nin^,ch^,' ',nin^,bu^,' ',nin^,tr^,' ',nin^, pi^,' ');
writeln(ten^,ch^,' ',ten^,bu^,' ',ten^,tr^,' ',ten^, pi^);
write(J^,ch^,' ',J^,bu^,' ',J^,tr^,' ',J^, pi^,' ');
write(Q^,ch^,' ',Q^,bu^,' ',Q^,tr^,' ',Q^, pi^,' ');
write(K^,ch^,' ',K^,bu^,' ',K^,tr^,' ',K^, pi^,' ');
write(A^,ch^,' ',A^,bu^,' ',A^,tr^,' ',A^, pi^);
readln
end.
60K
27 апреля 2010 года
Wilk
1 / / 27.04.2010
для того, чтобы обеспечить навигацию по списку сделай следующее:

type TrData = record
suit : string;
rank : char;
end;

TpElm = ^TrElm;

TrElm = record
data : TrData;
next,
prev : TpElm;
end;
TrData - запись, хранящая информационную часть элемента. объявлена отдельным типом для удобства работы: в случае необходимости можно менять отдельно этот тип, не трогая основного элемента. К тому же намного удобнее написать отдельную процедуру ввода именно этой информационной части, которая будет весьма универсальна.

TpElm - тип указателя на элемент списка. Опять же введён для удобства написания и чтения программы, для улучшения наглядности.

TrElm - собственно сам элемент списка. Содержит информационную часть, описанную выше, а так же два указателя на объект типа TrElm - на два других элемента списка: prev - на предыдущий, next - на следующий. Необходимы они для перемещения по списку. У первого элемента списка prev указывает на nil, у последнего - next указывает на nil.

При работе двунаправленные списки намного удобнее однонаправленных из-за связей элемента с предшествующим ему и следующим за ним.

При желании можно обойтись без отдельных указателей на начало и конец такого списка, но лучше этого не делать. Удобно сделать отдельные переменные, содержащие адрес начала и конца списка. Это удобно для поиска и редактирования списка, для его создания. Например, если надо найти элемент по номеру, можно идти от начала или конца списка в зависимости от того, к чему искомый элемент ближе.

По поводу перемешивания - просто манипулируем указателями на элементы next и prev, для достижения нужного эффекта. Думаю, это автор может сделать сам.

К МОДЕРАТОРАМ. Прошу не удалять сообщение, ведь ответ так и не был дан, а тема двунаправленных списков весьма актуальна для студентов, ведь объясняют, как правило, однонаправленные, а работать удобнее с двунаправленными
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог