Реферат: Линейные списки. Стек. Дек. Очередь

Содержание

Введение 3

Глава 1.Динамические типы данных_ 6

1.1 Списки. Очередь.Стек. Дек. 6

1.2Динамические информационные структуры_ 22

Глава 2. Разработкафакультативного курса «Динамические типы данных»_ 29

2.1 Методическиерекомендации по введению факультативного курса в школе_ 29

2.2Разработка программного средства по теме «Динамические типы данных»_ 38

Заключение 42

Литература_ 44

Приложение 1.(Листинг программы) 45

Введение

/>Сегоднячеловек живет в мире, где информация имеет огромное значение. Жизненно важнонаучиться правильно с ней работать и использовать различные инструменты дляэтой работы. Одним из таких  инструментов является компьютер, который сталуниверсальным помощником человеку в различных сферах деятельности.

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

Чтобы правильно использовать машину, важно добиться хорошегопонимания структурных отношений, существующих между данными, способовпредставления таковых в машине и методов работы с ними.

Изучить наиболее важные факты, касающиеся информационныхструктур: их статические и динамические свойства; средства распределения памятии представления данных; эффективные алгоритмы для создания, изменения,разрушения структурной информации и доступа к ней.

В простейшей форме таблица может быть линейным спискомэлементов. Тогда присущие ей структурные свойства содержат в себе ответы натакие вопросы, как: «Какой элемент является первым в списке? какой — последним?какой элемент предшествует данному или следует за данным?» Можно много говорить оструктуре даже в этом совершенно очевидном случае.

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

Системы обработки списков полезныв очень многих случаях, однако при их использовании программист нередко сталкиваетсяс излишними ограничениями.

Теперь целесообразно определить несколько терминов и понятий, которыми мы будем часто пользоваться вдальнейшем. Информация в таблице представлена множеством узлов (некоторыеавторы называют их «записями», «бусинами», «объектами»); мы иногда вместо «узел» будемговорить «элемент». Каждый узел состоит из одного или нескольких последовательных слов в памяти машины, разделенныхна именуемые части, называемые полями. В простейшем случае узел — это простоодно слово памяти, он имеет только одно поле, включающее все слово.

В связи с этим цель нашей работы:Знакомство с теоретическим положением, касающиеся информационных структур и разработкапрограммного средства «Динамические структуры данных».

Этой целью определяется следующая гипотеза:если при изучении данной темы будет использоваться компьютер, то усвоение темыбудет более успешным, так как усиливает мотивацию, и влияет на конечныйрезультат.

Предмет исследования: Изучениединамических информационных структур.

Объект исследования: Знакомствоучащихся с основами программирования.

Достижением цели и согласно поставленной гипотезы определяютсяследующие задачи:

1.     Изучить литературу по теме динамические информационные структуры,педагогическую и методическую по теме исследования;

2.     Проанализировать виды динамических информационных структур;

3.     Разработать факультатив по теме исследования;

4.     Разработать программный продукт по теме исследования.

Глава 1. Динамические типы данных1.1 Списки. Очередь. Стек. Дек.

Список (list) – набор элементов, расположенныхв определенном порядке. Таким набором быть может ряд знаков в слове, слов впредложений в книге. Этот термин может также относиться к набору элементов надиске. Использование при обработке информации списков в качестве типов данныхпривело к появлению в языках программирования средств обработки списков.

Список очередности (pushup list) – список, вкотором последний поступающий элемент добавляется  к нижней части списка.

Список с использованием указателей (linked list) –список, в котором каждый элемент содержит указатель на следующий элементсписка.

Линейный список (linear list) этомножество, состоящее из /> узлов />,структурные свойства которого по сути ограничиваются лишь линейным (одномерным)относительным положением узлов, т. е. теми условиями,что если />, то /> является первым узлом; если/>, то k-му узлу /> предшествует/> и за ним следует />; /> является последним узлом.

Операции, которые мы имеем право выполнять с линейнымисписками, включают, например, следующие:

1.   Получить доступк k-му узлу списка, чтобы проанализировать и/или изменитьсодержимое его полей.

2.   Включить новыйузел непосредственно перед k-ым узлом.

3.   Исключить k-й узел.

4.   Объединить два(или более) линейных списка в один список.

5.   Разбить линейныйсписок на два (или более) списка.

6.   Сделать копиюлинейного списка.

7.   Определитьколичество узлов в списке.

8.   Выполнитьсортировку узлов списка в возрастающем порядке понекоторым полям в узлах.

9.   Найти в спискеузел с заданным значением в некотором поле.

Специальные случаи k=1 и k=n в операциях (1), (2) и (3) особо выделяются, поскольку в линейном спискепроще получить доступ к первому и последнему элементам, чем к произвольномуэлементу.

В машинных приложениях редко требуются все девять из перечисленныхвыше операций в самом общем виде. Мы увидим, что имеется много способов представлениялинейных списков в зависимости от класса операций, которые необходимо выполнятьнаиболее часто. По-видимому, трудно спроектировать единственный методпредставления для линейных списков, при котором все эти операции выполняютсяэффективно; например, сравнительно трудно эффективно реализовать доступ к k-му узлу в длинном списке для произвольного k, если вто же время мы включаем и исключаем элементы в середине списка. Следовательно,мы будем различать типы линейных списков по главным операциям, которыес нимивыполняются.

Очень часто встречаются линейные списки, в которыхвключение, исключение или доступ к значениям почти всегда производятся в первомили последнем узлах, и мы дадим им специальные названия:

Многие люди поняли важность стеков и очередей и дали другиеназвания этим структурам; стек называли пуш-даун (push-down)списком, реверсивной памятью, гнездовой памятью, магазином, списком типа LIFO («last-in-first-out» — «последнимвключается — первым исключается») и даже употребляется такой термин, каксписок йо-йо! Очередь иногда называют — циклическойпамятью или списком типа FIFO («first-in-first-out» — «первым включается — первым исключается»). В течение многих лет бухгалтеры использовалитермины LIFO и FIFO как названия методов при составлении прейскурантов. Ещеодин термин «архив» применялся к декам с ограниченнымвыходом, а деки с ограниченным входом называли«перечнями», или «реестрами». Такоеразнообразие названий интересно само по себе, Посколькуоно свидетельствует о важности этих понятий. Слова «стек» и«очередь» постепенно становятся стандартными терминами; из всехдругих словосочетаний, перечисленных выше, лишь «пуш-даун список»остается еще довольно распространенным, особенно в теории автоматов.

При описании алгоритмов, использующих такие структуры, принята специальная терминология; так, мы помещаемэлемент на верх стека или снимаем верхний элемент. Внизу стека находится наименее доступный элемент, и онне удаляется до тех пор, пока не будут исключены все другие элементы. Частоговорят, что элемент опускается (push down) в стек или что стек поднимается(pop up), если исключается верхний элемент. Эта терминология берет свое началоот «стеков» закусок, которые можно встретить в кафетериях, или поаналогии с колодами карт в некоторых перфораторных устройствах. Краткость слов«опустить» и «поднять» имеет свое преимущество, но этитермины ошибочно предполагают движение всего списка в памяти машины. Физически, однако, ничего не опускается; элементыпросто добавляются сверху, как при стоговании сенаили при укладке кипы коробок. В применении к очередям мы говорим о началеи конце очереди; объекты встают в конец очереди и удаляются в момент,когда наконец достигают ее начала. Говоря о деках,мы указываем левый и правый концы.Понятие верха, низа, начала и конца применимо иногда и к декам, если онииспользуются как стеки или очереди. Не существует, однако, каких-либостандартных соглашений отно­сительно того, где должен быть верх, начало иконец: слева или справа. Таким образом, мы находим, что в наших алгоритмахприменимо богатое разнообразие описательных слов: «сверху — вниз» —для стеков, «слева — направо» — для деков и «ожидание в очереди»—для очередей.

Однонаправленный и двунаправленный список –это линейный список, в котором все исключения и добавления происходят в любомместе списка.

/> <td/> />
Однонаправленный список отличается от двунаправленного списка только  связью.То есть в однонаправленном списке можно перемещаться только в одном направлении(из начала в конец), а двунаправленном – в любом. Из рисунка это видно: сверхуоднонаправленный список, а снизу двунаправленный

/>

/> <td/> />
На рисунке видно как добавляется и удаляется элемент из двунаправленногосписка. При добавлении нового элемента (обозначен N) между элементами 2 и 3.Связь от 3 идет к N, а от N к 4, а связь между 3 и 4 удаляется./> <td/> />
В однонаправленном списке структура добавления и удаления такая же только связьмежду элементами односторонняя.

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

Очередьтип данных, при котором новыеданные располагаются следом за существующими в порядке поступления; поступившиепервыми данные при этом обрабатываются первыми.

/> <td/> />
В некоторых разделах математики слово «очередь»используют в более широком смысле, обозначая любой сорт списка, в которомпроизводятся включения и исключения; указанные выше специальные случаи называютсятогда «очередями с различными дисциплинами». Однако здесь термин«очередь» используется лишь в узком смысле, аналогичном упорядоченнымочередям людей, ожидающим обслуживания.

Правило здесь такое же, как в живой очереди: первым пришёл—первымобслужен. Пришел новый покупатель, встал (добавился) в конец очереди, а которыйуже отоварился ушел (удалился) из начала очереди. То есть первым пришел, первымушел.

Другими словами, у очереди естьголова (head) ихвост (tail). Элемент, добавляемый в очередь, оказываетсяв её хвосте, как только что подошедший покупатель; элемент, удаляемый изочереди, находится в её голове, как тот покупатель, что отстоял дольше всех.

/> <td/> />
В очереди новый элемент добавляется только с одного конца. Удаление элементапроисходит на другом конце. В данном случае это может быть только 4 элемент.Очередь по сути однонаправленный список, только добавление и исключение элементовпроисходит на концах списка.

Стек (stack) линейный список, вкотором все включения и исключения (и обычно всякий доступ) делаются в одномконце списка.

/>Стек  —часть памяти ОЗУ компьютера, которая предназначается для временногохранения байтов, используемых микропроцессором; при этом используется порядокзапоминания байтов «последним вошел – первым вышел», поскольку такие ввод ивывод организовывать проще всего, также операции осуществляются очень быстро.Действия со стеком производится при помощи регистра указателя стека. Любоеповреждение этой части памяти приводит к фатальному сбою.

Стек в виде списка (pushdown list) – стек, организованныйтаким образом, что последний вводимый в область памяти элемент размещается навершине списка.

Из стека мы всегда исключаем «младший» элемент изимеющихся в списке, т. е. тот, который был включенпозже других. Для очереди справедливо в точности противоположное правило:исключается всегда самый «старший» элемент; узлы покидают список втом порядке, в котором они в него вошли.

Стеки очень часто встречаются в практике. Простым примеромможет служить ситуация, когда мы просматриваем множество данных и составляемсписок особых состояний или объектов, которые должны обрабатываться позднее;когда первоначальное множество обработано, мы возвращаемся к этому списку ивыполняем последующую обработку, удаляя элементы из списка, пока список не станетпустым. Для этой цели пригодны как стек, так и очередь, но стек, как правило,удобнее. При решении задач наш мозг ведет себя как «стек»: однапроблема приводит к другой, а та в свою оче­редь к следующей; мы накапливаем встеке эти задачи и подзадачи и удаляем их по мере того, как они решаются. Аналогично процесс входов в подпрограммы ивыходов из них при выполнении машинной программы подобен процессуфункционирования стека. Стеки особенно полезны при обработке языков, имеющихструктуру вложений. К ним относятся языки программирования, арифметическиевыражения и немецкие «Schachtelsatze»/буквально «вложенные предложения»/. Вообще, стеки чаще всеговозникают в связи с алгоритмами, имеющими явно или неяв­но рекурсивный характер.

/>Представьте себе, что четырежелезнодорожных вагона находятся на входной стороне пути (рис. 1) и перенумерованысоответственно 1, 2, 3 и 4. Предположим, что мы выполняем следующуюпоследовательность операций (которые согласуются снаправлением стрелок на рисунке и не требуют, чтобы вагоны«перепрыгивали» друг через друга). Отправьте:

(а) вагон 1 в стек;/>

(b) вагон 2 в стек;

(с) вагон 2 на выход;/>

(d) вагон 3 в стек;

(е) вагон 4 в стек;/>

(f) вагон 4 на выход;/>

(g) вагон 3 на выход;/>

(h) вагон 1 на выход.

В результате этих операций первоначальный порядок вагонов,1234, изменился на 2431. Цель этого упражнения состоит в том, чтобы исследовать, какие перестановки можно получить, используястеки, очереди и деки.

/> <td/> />
В стеке элемент добавляется и удаляется только с одного конца. На рисунке этоэлемент N. То есть если он добавился, то удаляется может сначала только он, ауж потом все остальные.

Стек можно представить  себе как коробку, в которую складываюткакие-нибудь предметы, чтобы достать самый нижний нужно предварительно вытащитьостальные. Стек можно уподобить стопке тарелок, изкоторой можно взять верхнюю и на которую можно положить новую тарелку. [Другоеназвание стека в русской литературе — «магазин» — понятно всякому, кто разбиралавтомат Калашникова].

/> <td/> />
Дек (deck) (стек с двумя концами) — линейный список, в которомвсе включения и исключения (и обычно всякий доступ) делаются на обоих концахсписка.

Иногда аналогия с переключением железнодорожных путей,предложенная Э. Дейкстрой,помогает понять механизм стека. На рис. 2.Изображен дек в виде железнодорожного разъезда.

/>

/>Следовательно, декобладает большей общностью, чем стек или очередь; он имеет некоторые общиесвойства с колодой карт (в английском языке эти слова созвучны). Мы будемразличать деки с ограниченным выходом или ограниченным входом; втаких деках соответственно исключение или включение допускается только на одномконце.

В деке все исключения и добавления происходят на обоих егоконцах. Дек по сути двунаправленный список.

В связанном списке (linked list)элементы линейно упорядочены, но порядок определяется не номерами, как вмассиве, а указателями, входящими в состав элементов списка. Списки являютсяудобным способом хранения динамических множеств, позволяющим реализовать все операции, (хотя и не всегда эффективно).

Если каждый стоящий в очереди запомнит, кто за ним стоит,после чего все в беспорядке рассядутся на лавочке, получится односторонне связанный список; если он запомнитещё и впереди стоящего, будет двусторонне связанный список.

Другими словами, элементдвусторонне связанного списка(doubly linked list) — это запись, содержащая три поля: key(ключ) и два указателя — next (следующий) и prev(от previous—предыдущий). Помимо этого, элементы списка могут содержатьдополнительные данные. Если х —элементсписка, то next указывает на следующий элементсписка, а prev — на предшествующий. Если prev{х}=nil, то у элемента х нет предшествующего:этоголова (head) списка. Если next{х}=nil, то х — последнийэлемент списка или, как говорят, егохвост (tail).

Прежде чем двигаться по указателям, надо знать хотя бы одинэлемент списка. В различных ситуациях используются разные виды списков. Водностороннесвязанном (singly linked)списке отсутствуют поля prev. Вупорядоченном (sorted) спискеэлементы расположены в порядке возрастания ключей, так что у головы списка ключнаименьший, а у хвоста списка — наибольший, в отличие от неупорядоченного(unsorted) списка. В кольцевом списке (circular list)поле prev головы списка указывает на хвостсписка, а поле next хвоста списка указывает на голову списка.

/> <td/> />
Если иное не оговорено особо, под списком мы будем понимать неупорядоченныйдвусторонне связанный список.

Вместо того чтобы хранить список в последовательных ячейкахпамяти, можно использовать значительно более гибкую схему, в которой каждыйузел содержит связь со следующим узлом списка.

Здесь А, В, С, D и Е— произвольные ячейки в памяти, а Л —пустая связь. Программа, в которой используется такая таблица, имела бы, вслучае последовательного распределения, дополнительную переменную или константу,значение которой по­казывает, что таблица состоит из пяти элементов; эту жеинформа­цию можно задать с помощью признака конца («пограничника»),снабдив им элемент 5 или следующую ячейку, В случае связанного распределения впрограмме имеется переменная связи или константа, которая указывает на А, аотправляясь от А, можно найти все другие элементы списка.

Cвязи часто изображаются просто стрелками, поскольку, какправило, безразлично, какую фактическую ячейку памяти занимает элемент. Поэтомуприведенную выше связанную, таблицу можноизобразить следующим образом:

/>
ЗдесьFIRST — переменная связи, указывающая на первый узел в списке.

Теперь мы можем сопоставить эти две основные формы храненияинформации:

1) Связанное распределение требует дополнительного пространствав памяти для связей. В некоторых ситуациях этот фактор может быть доминирующим.Однако мы часто встречаемся с таким положением, когда информация в узле незанимает все слово целиком, и поэтому место для поля связи уже существует.Кроме того, во многих применениях несколько элементов можно объединять в одинузел, и, следовательно, потребуется лишь одна связь ни несколько элементовинформации. Но гораздо важнее тот факт, что при использовании связанной памятичасто возникает неявный выигрыш в памяти, поскольку можно совмещатьобщие части таблиц; и во многих Случаях последовательное распределение не будетстоль эффективным, как связанное, если так или иначе не остается пустымдовольно большое количество ячеек памяти.

2) Легко исключить элемент, находящийся внутри связанногосписка. Например, чтобы исключить элемент 3, нам необходимо только изменитьсвязь в элементе 2. При последовательном же распределении такое исключениеобычно потребует перемещения значительной части списка вверх на другие места памяти.

3) Если используется связанная схема, то легко включитьэлемент в список. Например, чтобы включить элемент /> в(1), необходимо изменить лишь две связи:

/>
Такая операция заняла бы значительное время при работе с длинной последовательнойтаблицей.

4) При последовательном распределении значительно быстреевыполняются обращения к произвольным частям списка. Доступ к k-му элементусписка, если k — переменная, для последовательного распределениязанимает фиксированное время, а для связанного — необходимо k итераций,чтобы добраться до требуемого места. Таким образом,полезность связанной памяти основывается на том факте, что в огромномбольшинстве приложений мы будем продвигаться по списку последовательно, а непроизвольным образом; если нам необходимы элементы в середине или в нижнейчасти списка, то постараемся завести дополнительную переменную связи или списокпеременных связи, которые указывают на соответствующие места в списке.

5) При использовании схемы со связями упрощается задача объединениядвух списков или разбиения списка на части.

6) Схема со связями годится для структур более сложных, чемпростые линейные списки. У нас может быть переменное количество списков, размеркоторых непостоянен; любой узел одного списка может быть началом другогосписка; в одно и то же время узлы могут быть связаны в несколько последовательностей,соответствующих различным спискам, и т.д.

7) На многих машинах простые операции, такие, как последовательноепродвижение по списку, выполняются несколько быстрее для последовательныхсписков.

Таким образом, мы видим, что метод связывания, которыйосвобождает нас от ограничений, возникающих вследствие последовательной природымашинной памяти, при некоторых операциях обеспечивает существенно большуюэффективность, но в ряде случаев приводит к потере некоторых возможностей. Обычнов конкретной ситуации очевидно, какой метод распределения наиболее приемлем, ичасто в программе для организации различных списков используются оба метода.

/>В следующих несколькихпримерах мы будем ради удобства предполагать, что узел — это одно слово и чтооно разделено на два поляINFO и LINK:

Использование связанного распределения, как правило,предполагает существование некоторого механизма поиска пустого пространства длянового узла, когда мы хотим включить в список некоторую вновь образованную информацию.Для этой цели обычно существует специальный список, называемый спискомсвободного пространства.

/>Циклическоекольцо или список (circular list или ring) – файл, у которого нет определенногоначала и конца; каждый элемент файла содержит указатель на начало следующего элемента;при этом «последний» элемент указывает на «первый», так что к списку можнообратиться с любого элемента.

/>
Циклически связанный список (сокращенно — циклический список)обладает той особенностью, что связь его последнего узла не равна Л, а идетназад к первому узлу списка. В этом случае можно получить доступ к любомуэлементу, находящемуся в списке, отправляясь от любой заданной точки;одновременно мы достигаем также полной симметрии, и теперь нам уже неприходится различать в списке «последний» или «первый»узел. Типичная ситуация выглядит следующим образом:

Предположим, в узлах имеется два поля: INFO и LINK.Переменная связи PTR указывает на самый правый узел списка, a LINK (PTR)является адресом самого левого узла.

Разного рода расщепления одного циклического списка на два,соответствуют операциям конкатенации (объединения) и деконкатенации(разъединения) цепочек.

Таким образом, мы видим, что циклические списки можноиспользовать не только для представления структур, которым свойственнацикличность, но также для представления линейных структур; циклический список содним указателем на последний узел, по существу, эквивалентен простомулинейному списку с двумя указателями на начало и конец. В связи с этимнаблюдением возникает естественный вопрос: Как найти конец списка, имея в видукруговую симметрию? Пустой связи Л, которая отмечает конец, не существует.Проблема решается так: если мы выполняем некоторые операции, двигаясь по спискуот одного узла к следующему, то мы должны остановиться, когда мы вернулись кисходному месту (предполагая, конечно, что исходное место все еще присутствуетв списке).

/> <td/> />
Другим решением только что поставленной проблемы можетбыть включение в каждый циклический список специального отличимого узла,который служит местом, удобным для остановки. Этот специальный узел называетсяголовой списка, и во многих приложениях можно ради удобства потребовать, чтобыкаждый циклический список имел один узел, который является головой этогосписка. Одно из преимуществ в этом случае заключается в том, что циклическийсписок никогда не будет пустым.

При ссылке на списки вместо указателя на правыйконец списка используется обычно голова списка, которая часто находится вфиксированной ячейке памяти.

В качестве примера использования циклических списковрассмотрим арифметические действия над многочленами от переменных х, у и z с целыми коэффициентами. Существует многозадач, в которых математик предпочитает работать с многочленами, а не просто счислами; речь идет об операциях, подобных умножению

/> на ,

дающему в итоге/>

.

Связанное распределение — естественный инструмент для этойцели, поскольку количество слагаемых в многочлене может расти и их число нельзязаранее предсказать; кроме того, может потребоваться, чтобы в памяти одновременноприсутствовало несколько многочленов.

1.2 Динамические информационные структуры

/>Динамическиепеременные и указатели автоматически порождаются при входе в тот блок, в которомони описываются, существуют на протяжении работы всего блока и уничтожаются привыходе их этого блока.

Обращение к статическим переменным производится по ихименам, а тип определяется их описанием. Вся работа по размещению статическихобъектов в памяти машины выполняется на этапе трансляции. Однако использованиетолько статических переменных может вызвать трудности при составлении эффективноймашинной программы. Во многих случаях заранее неизвестен размер той или инойструктуры данных, или структура может изменяться в процессе выполненияпрограммы. Одна из подобных структур — последовательный файл.

В языке Паскаль предусмотрена возможность использованиядинамических величин. Для них выделение и очистка памяти происходит не наэтапе трансляции, а в ходе выполнения самой программы. Для работы с динамическимивеличинами в Паскале предусмотрен специальный тип значений — ссылочный.Этот тип не отно­сится ни к простым, ни к составным.Переменные ссылочного типа, или указатели, являются статическими переменными.Значением переменной ссылочного типа является адрес ячейки — места в памятисоответствующей динамической величины. Свое значение ссылочная переменнаяполучает в процессе выполнения программы, в момент появления соответствующейдинамической величины.

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

Значением указателя является адрес ячейки, начиная с которойбудет размещена в памяти соответствующая динамическая величина.

/>

На этой схеме р. — имя указателя; звездочкой изображено значение указателя, а стрелкаотражает тот факт, что значением указателя является адрес объекта (ссылка наобъект), посредством которого объект и доступен в программе.

/>В некоторых случаяхвозникает необходимость в качестве значения указателя принять «пустую» ссылку, которая не связывает суказателем никакого объекта. Такое значение в Паскале задается служебным словомnil и принадлежит любому ссылочному типу. Результаты выполнения оператораp:=nil можно изобразить следующим образом:

Процедура new(i) выполняет две функции:

1) резервирует место в памяти для размещения динамическогообъекта соответствующего типа с именем i;

2) указателю i присваивает адресдинамического объекта i.

Однако, узнать адрес динамической переменной с помощьюпроцедуры writeln (i) нельзя.

Динамические объекты размещаются по типу стека в специальнойобласти памяти — так называемой«куче» свободной от программ и статических переменных.Символ ^ после имени указателя означает, что речь идет не о значении ссылочнойпеременной, а о значении того динамического объекта, на который указывает этассылочная переменная.

Имя ссылочной переменной с последующим символом ^ называют «переменной с указателем». Именно онасинтаксически выполняет роль динамической переменной и может быть использованав любых конструкциях языка, где допустимо использование переменных того типа,что и тип динамической переменной.

Если в процессе выполнения программы некоторый динамическийобъект р^, созданный в результате выполнения оператораnew(p), становится ненужным, то его можноуничтожить (очистить выделенное ему место в памяти) с помощью стандартнойпроцедуры dispose(p). В результате выполнения оператора вида dispose(p)динамический объект, на который указывает ссылочная переменная р, прекращаетсвое существование, занимаемое им место в памяти становится свободным, азначение указателя р становится неопределенным (но не равным nil).

Если до вызова процедуры dispose(p) имел пустое значениеnil, то это приведет к «зависанию» программы.

Если же до вызова этой процедуры указатель р не был определен,то это может привести к выходу из строя операционной системы.

Значение одного указателя можно присвоить другому указателютого же типа. Можно также указатели одинакового типа сравнивать друг с другом,используя отношения «=» или «о».

Стандартные процедуры new и dispose позволяют динамическипорождать программные объекты и уничтожать их, что дает возможность использоватьпамять машины более эффективно.

Связанные списки данных. Несмотря на богатый набортипов данных в Паскале, он не исчерпывает всего практически необходимого дляразработки многих классов программ. В частности, из разнообразных связанныхструктур данных в языке стандартизированы массивы и файлы, а кроме нихмогут потребоваться и схожие с ними, но иные структуры. Для них характерны, вчастности, следующие признаки:

а) неопределенное заранее число элементов;

б) необходимость хранения в оперативной памяти.

Средство для реализации таких структур дает аппарат динамическихпеременных. Простейшей из обсуждаемых структур являетсяоднонаправленныйсписок. Он строится подобно очереди на прием к врачу: пациенты сидят налюбых свободных местах, но каждый из них знает, за кем он в очереди (т.е.данные размещаются на свободных местах в памяти, но каждый элемент содержитссылку на предыдущий или следующий элемент). Поскольку количество пациентовзаранее не очевидно, структура является динамической.

Другая подобная структура — стек. Его моделью может служитьтрубка с запаянным концом, в которую вкатывают шарики. При этом реализуетсяпринцип «последним вошел — первым вышел». Возможное количество элементов встеке не фиксировано.

Остановимся на примере стека и покажем его программнуюреализацию. Технически при этом следует решить ряд задач, из которых наиболееспецифическими являются

а) связывание последующих компонентов стека;

б) смещение ссылок при каждом движении по стеку.

/> <td/> />
Из-за необходимости хранить не только значение каждого элемента, но и соот­ветствующуюссылку на последующий элемент, каждый из элементов будем хранить в видедвухполевой записи, в которой первое поле — значение элемента, а второе — ссылкана следующий элемент. Схематически эту структуру можно описать сле­дующимобразом

(элементу, который пришел первым, ссылаться не начто, о чем свидетельствует «пустая ссылка» nil).

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

Type

    List = ^Spisok; — Однонаправленный

    Spisok = record

        Info: Integer; — Информационное поле

        Next: List; — Ссылка на следующийэлемент

    end;

    ListTwo = ^SpisokTwo; — Двунаправленный

    SpisokTwo = record

        Info: Integer; — Информационноеполе

        Next: ListTwo; — Ссылка на следующийэлемент

        Prev: ListTwo; — Ссылка на предыдущийэлемент

    end;

 

Создание списка

procedure CreateLists; — процедура созданиясписка

begin

   X := Random(101); Определяем значение первогоэлемента

   Uk := nil;  Указателям присваиваем nil.

  q := nil;

AddToList (X, Uk);  Добавляем элемент Х всписок.

q := Uk; Формируем указатель на начало списка.

for i := 1 to 9 do  Добавляем оставшиесяэлементы в список.

   begin

      X := Random(101);

      AddToList (X, q);

   end;

  ListBegin := Uk;  Определяем указатель списка.

end;

<p/>

Уничтожение списка

procedure DestroyList(PointerBegin: List);   Процедурауничтожениясписка

(PointerBegin –указатель на начало списка).

begin

  while PointerBegin <> nildo    Еслиуказательнеnil, то

     begin

       q := PointerBegin;

       PointerBegin :=PointerBegin ^.Next;   Ссылканаследующий.

       if q <> nil thenDispose(q);  Уничтожение.

     end;

end;

<p/>

Добавление элемента в список

procedure AddToList(X: Integer;var PointerEndList: List);

Добавить элемент в конец списка

(PointerEndList — указатель на последний элеменBЀ списка)

begin

   if PointerEndList = nil then

 Если первый элемент еще не существует илисписок пуст, то

      begin

           New(PointerEndList);   Создаемновуюпеременную

           PointerEndList ^.Info:= X;    Инф. Части присваиваем элем.Х

           PointerEndList ^.Next:= nil;    Ссылкенаследующий — nil

       end

  else         иначедобавляем в список

    begin

        New(PointerEndList^.Next);    Создаемновуюссылку

        PointerEndList :=PointerEndList ^.Next;

Указателю присвоить ссылку на след. элемент

        PointerEndList ^.Info :=X;

        PointerEndList ^.Next :=nil;

    end;

end;

Удаление элемента из списка.

procedure DeleteFromList(Position:Integer);

Удаляет элемент под номером Position

begin

   q := ListBegin;   Присваивается ссылка напервый элемент

    if q <> nil then  Если список не пуст,то

begin

     if Position = 0 then  Если позиция = 0, тоудаляем первый элемент

       begin

           ListBegin := q^. Next;

            if q <> nil thenDispose(q);

       end

else

    begin

        i := 0;

        while (i < Position — 1) and (q <> nil) do

    Ищем элемент после которого нужно удалить

            begin

               q := q^. Next;

               Inc(i);

            end;

         r := q^. Next;

         if r <> nil then      Еслиудаляемый элемент существует, то удаляем его

            begin

              q^. Next := r^.Next;

              if r <> nilthen Dispose(r);

            end

  end;

end

end;

Глава 2. Разработка факультативного курса«Динамические типы данных»2.1 Методические рекомендации по введениюфакультативного курса в школе

В системе школьных факультативов необходимо изучениеинформатики с большей полнотой. Это требует в свою очередь особенно тщательногоотбора материала который может быть хорошо усвоен учащимися за ограниченноеколичество часов.

Разработанный нами факультатив рассчитан на 14 часов.

Задачи факультатива:

1)  Ввести понятиелинейного списка, однонаправленного и двунаправленного списка, циклическогосписка, стека, дека и очереди;

2)  Сформироватьпознавательный интерес у учащихся к информатике;

3)  Развить у учащихсятворческие способности.

Цель первого урока – дать учащимся на качественном уровненеобходимый подготовительный материал, который включает в себя:

1)  Определение линейногосписка.

2)  Операции со списками.

3)  Виды списков.

4)  Связанноераспределение.

5)  Динамическиепеременные.

На  2 – 6 уроках учащиеся знакомятся со списками болееглубже. Седьмой урок итоговый. Учащимся предлагается тестовая программа, вкоторой они отвечают на вопросы и  оценивают результаты полученных знаний. Вцелом же факультатив рассчитан на семь двух часовых занятий.

Общая структура факультатива такова:

№ урока

Тема

Кол-во часов

№1. Списки 2 №2. Однонаправленный и двунаправленный список 2 №3. Циклический список 2 №4. Очередь 2 №5. Стек 2 №6. Дек 2 №7. Тест 2

Конспекты уроков

Тема: «Очередь»

Цели:

1.   Раскрыть понятиелинейного списка «Очередь».

2.   Научитьсяиспользовать «Очередь» на практике при решении задач.

3.   Сформировать уучащихся познавательный интерес к информатике.

Этап урока

Время (мин.)

1. Организационный момент 2 2. Подготовка к лабораторной работе 10 3. Выполнение лабораторной работы 20 4. Закрепление 8

Лабораторная работа №4 по теме«Очередь».

1.   Нажмитекнопку «Теория» для очереди.

Внимательно изучитетеоретический материал.

2.   Нажмитекнопку «Обновить» для формирования списков.

Кнопки "<< и >>"служат для перемещения курсора по очереди.

а) Переместитесь вправо до 3 элемента;

б) Переместитесь влево (см. коментарии);

Кнопка «Добавить» служит длядобавления элемента в очередь.

а) Добавьте 1, 4, 5-м элементами число99;

б) Добавьте последним число 999;

Кнопка «Удалить» служит дляудаления элемента из очереди.

Удалите 1, 2, 3 элементы;

3.   На листеформата А4, опишите ход проделанной работы.

Ответьте на поставленные вопросы:

1)   Как удаляется идобавляется элементы в очереди?

2)   В чем различие исходство очереди и однонаправленного списка?

3)   Что называетсяголовой и хвостом очереди?

4)   Какрасполагаются элементы в очереди?

________________________________________________________________

Задачи для самостоятельного решения:

1)   Пусть ужепостроена очередь Q, содержащая целые числа. Вычислитьсумму и произведение элементов, находящихся в очереди.

2)   Пусть ужепостроена очередь Q, содержащая целые числа. Сформироватьновую очередь P, состоящую из элементов очереди Q, кратных числу 3.

3)   Пусть ужепостроена очередь Q, содержащая целые числа. Вычислитьколичество простых чисел, находящихся в очереди.

Учитель

Ученик

ПК

Тетрадь

2 этап — Подготовка к лабораторной работе

Запускаем демонстрационную программу. Нажмите кнопку теория. Перед вами появилось окно с теоретическим материалом. Внимательно ознакомьтесь с новым материалом. Обратите внимание на примеры создания очереди и получения элемента из очереди. Провести аналогию между очередью и однонаправленным списком. Знакомится с новым материалом. Теоретический материал по теме «очередь».

Определение «очереди».

Порядок расположения данных.

Примеры создания очереди и получения элемента из очереди.

3 этап — Выполнение лабораторной работы

Открываем лабораторную работу №4.

Внимательно читаем задание и начинаем выполнять.

Выполняет лабораторную работу.

Лабораторная работа
№4.

После выполнения заданий ответьте на поставленные вопросы. Отвечает на вопросы. Ответы на вопросы. Попробуйте выполнить практические задания. Решает задачи. Delphi или Pascal. Листинг задачи.

4 этап — Закрепление лабораторной работы

Итак, давайте подведем итоги сегодняшней работы. /> Что называется очередью? Очередь — линейный список, в котором все включения производятся на одном конце списка, а все исключения на другом конце. Как располагаются данные в очереди? Очередь — тип данных, при котором новые данные располагаются следом за существующим в порядке поступления; Какие данные в очереди обрабатываются первыми? Данные поступившие первыми обрабатываются первыми. Что такое «голова», «хвост» очереди? Элемент, добавляемый в очередь, оказывается в её хвосте. Элемент, удаляемый из очереди, находится в её голове. В чем схожи очередь и однонаправленный список?

Очередь, по сути, однонаправленный список, только

добавление и исключение элементов происходит на концах списка.

Тема: «Стек»

Цели:

1.   Раскрыть понятиелинейного списка «Стек».

2.   Научитьсяиспользовать «Стек» на практике при решении задач.

3.   Сформировать уучащихся познавательный интерес к информатике.

Этап урока

Время (мин.)

1. Организационный момент 2 2. Подготовка к лабораторной работе 10 3. Выполнение лабораторной работы 20 4. Закрепление 8

Лабораторная работа №5 по теме«Стек».

1.   Нажмитекнопку «Теория» для стека.

     Внимательно изучите теоретический материал.

2.   Нажмитекнопку «Обновить» для формирования списков.

Кнопки "<< и >>"служат для перемещения курсора в стеке.

а) Переместитесь вправо до 4 элемента;

б) Переместитесь влево (см.комментарии);

Кнопка «Добавить» служит длядобавления элемента в стек.

Добавьте 1, 3, 5 элементами число 22;

Кнопка «Удалить» служит дляудаления элемента из стека.

Удалите 1, 3, 5, последний элементы;

3.   На листеформата А4, опишите ход проделанной работы.

Ответьте на поставленные вопросы:

1)   Как удаляется идобавляется элементы в стек?

2)   Приведи примерыстека на практике?

________________________________________________________________

Задачи для самостоятельного решения:

1)   Предположим, чтоуже построен стек, элементами которого являются целые числа. Написатьпрограмму, которая находит сумму элементов, находящихся в стеке.

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

3)   Предположим, чтоуже построен стек, элементами которого являются целые числа. Написатьпрограмму, которая удаляет из стека все элементы, кратные 4 (использовать дляпромежуточного хранения элементов стека однонаправленный список с заглавнымзвеном).

Учитель

Ученик

ПК

Тетрадь

2 этап — Подготовка к лабораторной работе

Запускаем демонстрационную программу. Нажмите кнопку теория. Перед вами появилось окно с теоретическим материалом. Внимательно ознакомьтесь с новым материалом. Обратите внимание на примеры создания стека и получения элемента из стека. Провести аналогию между очередью и стеком. Знакомится с новым материалом. Теоретический материал по теме «стек».

Определение «стека».

Порядок расположения данных.

Примеры создания стека и получения элемента из стека.

3 этап — Выполнение лабораторной работы

Открываем лабораторную работу №5.

Внимательно читаем задание и начинаем выполнять.

Выполняет лабораторную работу.

Лабораторная работа
№5.

После выполнения заданий ответьте на поставленные вопросы. Отвечает на вопросы. Ответы на вопросы. Попробуйте выполнить практические задания. Решает задачи. Delphi или Pascal. Листинг задачи.

4 этап — Закрепление лабораторной работы

Итак, давайте подведем итоги сегодняшней работы. /> Что называется стеком?

Стек — линейный список, в котором все включения и

исключения делаются в одном конце списка.

Как располагаются данные в стеке? Стек, организован таким образом, что последний вводимый в область памяти элемент размещается на вершине списка. Различия между очередью и стеком?

Из стека мы всегда исключаем «младший» элемент из имеющихся в списке, т. е. тот, который был включен позже других. Для очереди справедливо в точности противоположное правило: исключается

всегда самый «старший» элемент; узлы покидают список в том

порядке, в котором они в него вошли.

Тема: «Тест»

Цели:

1.   Закрепитьполученные знания по пройденному курсу.

2.   Выяснитьрезультативность полученных знаний с помощью теста.

3.   Сформировать уучащихся познавательный интерес к информатике.

Этап урока

Время (мин.)

1. Организационный момент 2 2. Подготовка к тесту 10 3. Тест 20 4. Подведение итогов 8

Лабораторная работа №7 по теме«Тест».

1.   Повторитевесь теоретический материал.

2.   Поработайтес демонстрационной программой.

3.   Запуститетест (сервис\тест или Ctrl + T).

4.   Ответьтена поставленные вопросы теста.

5.   Результатытеста сообщить преподавателю.

Учитель

Ученик

ПК

Тетрадь

2 этап — Подготовка к тесту

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

Определения списков.

Включение и исключение элементов из списков. Общее и различия между списками.

3 этап – Тест

Запускаем тест. (Меню: Сервис\Тест). Перед вами появилось окно «Тест». В верхнем левом поле предлагается вопрос, ниже под полем предлагаются на выбор несколько вариантов ответов. Правой клавишей мыши щелкаете на правильный по вашему мнению ответ. После выбора ответа, кнопка «Далее» становится активной, нажимаете ее. После нажатия на кнопку «Далее», появится следующий вопрос.

Продолжаете далее, пока не появится оценка за тест.

Тестируется. Тест. Результат сообщите учителю. Оценка за тест. Если результат оказывается неудовлетворительный, ученику предлагается повторить пройденный материал, и проверить свои знания на следующем уроке. После проведения теста, вызов теста блокируется.

4 этап – Подведение итогов

Итак, мы с вами изучили линейные списки.

Подведем итоги. Вы ознакомились с такими списками как: однонаправленный и  двунаправленный списки, стек, дек, очередь и циклический список. Вы узнали, что такое связанное распределение и динамические информационные структуры. Научились использовать полученные знания на практике при решении задач.

При помощи теста оценили результаты полученных знаний.

Если кого, что-то заинтересовало или кто-то полностью не усвоил пройденный материал, то он может подойти к учителю и получить интересующие его сведения. Сообщаются оценки за тест, и за факультатив в общем. 2.2 Разработка программного средства по теме«Динамические типы данных»

После загрузки демонстрационной программы перед вамипоявится вот такое окно.

/>

Это главная форма демонстрационной программы. Дляформирования списков нажмите кнопку «Обновить». 

/>

Теперь списки сформированы и готовык работе. Списки содержат целые положительные числа. Указатели указывают на началосписка. С помощью кнопок «<<» «>>» можно перемещать указатель посписку. С помощью кнопки «Добавить» вы можете добавить элемент в список. Принажатии на кнопку «Добавить» всплывает окно «Добавление нового элемента», вкотором вы указываете какой элемент хотите добавить и нажимаете кнопку «Ok».

/>   />

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

При нажатии на кнопку теория (для очереди) открывается окно«Очередь», котором изложена теория и даны примеры.

/>

Аналогично для остальных списков.

Для более удобной работы с учащимися в программе предусмотренылабораторные работы (Ctrl + L или Сервис \ Лабораторные работы). Если вы выберете все тооткроется окно «Лабораторные работы», в котором даны сразу все работы изадания. Перед вами 4 лабораторная работа на список «Очередь».

/>

Если вы будете выбирать каждую в отдельности то они будут отображатьсяв комментариях на главной форме.

Помощь можно вызвать (Справка\Помощь или F1).

/>

После проведения всех лабораторных работ учащимсяпредлагается ответить на вопросы теста, за который они получают оценку. Призапуске теста (Сервис\Тест или Ctrl + T)открывается окно «Тест».

/>

Сверху вопрос, ниже варианты ответов. После выбора ответакнопка «Далее» становится активной, нажав на нее появляется следующий вопрос.После выполнения теста выдается оценка, если неудовлетворительная то открываетсяокно «Лабораторные работы».

Примечание: после того кактест запустился вызов теста становится неактивным т.е. второй раз учащийсязапустить тест не сможет.

Закрыть программу можно нажатием на кнопку «Закрыть» или F10.

Заключение

В квалификационной работе мы попытались раскрыть более полнои наглядно понятие линейного списка, однонаправленного и двунаправленногосписков, стека, дека и очереди. Сформировать и закрепить познавательныйинтерес  к данной теме у учащихся. Выявлять и развивать творческие способностив использовании полученного навыка при программировании.

Главной целью нашей работы было знакомство с теоретическимматериалом, касающийся информационных структур и разработка программногосредства «Динамические типы данных».

Достижением этой цели и согласно поставленной гипотезыопределялись следующие задачи:

1.   Изучитьлитературу по теме динамические информационные структуры, педагогическую иметодическую по теме исследования;

2.   Проанализироватьвиды динамических информационных структур;

3.   Разработатьфакультатив по теме исследования;

4.   Разработатьпрограммный продукт по теме исследования.

Все поставленные цели и задачи реализованы в данной квалификационнойработе. Изучено понятие линейного списка, всевозможные операции с этим списком,определяются основные термины и понятия. Кроме того, рассматривается болееконкретно и полно каждый список в отдельности и показывается целесообразностьиспользования списков в тех или иных случаях. Для каждого списка приводятсяжизненные примеры для простоты восприятия. Дается понятие связанногораспределения и кратко изучается понятие динамических информационной структуры,которая позволяют применить полученные знания при программировании. Такжерассматривается преимущество и недостатки двух форм представления информации:связанное и последовательное. Далее следует методическая часть, в которойпредставлена расчасовка факультатива, его структура, и поставлены цели и задачифакультатива. Приводится для примера три конспекта уроков по теме «Очередь»,«Стек» и «Тест». И  последнее это руководство пользователя, в котором даетсяописания работы с демонстрационной программой.

Литература

1.   Айен Синклер«Большой толковый словарь компьютерных терминов», М.: 1998 г.  

2.   Архангельский А.Я. «Программирование в Delphi 4», М.: 1999 г.

3.   Архангельский А.Я. «Программирование в Delphi 5», М.: 2000 г.

4.   Вирт Н.«Алгоритмы и структуры данных», Москва Изд. Мир, 1989 г.

5.   Гудмэн Д.«Управление памятью для всех», Киев 1995 г.

6.   Зубов В. С.«Справочник программиста», М.: 1999 г.

7.   Кнут Д.«Искусство программирования для ЭВМ», т.1 Основные алгоритмы, Изд. Мир М.: 1976г.

8.   Кормен Т. идругие «Алгоритмы построения и анализ», М.: 2000 г.

9.   Подласый И. П.Учебник для студентов высших педагогических учебных заведений, М.: Просвещение1996 г.

10.   Усова А. В.«Формирование у школьников понятий в процессе обучения», М.: Педагогика, 1986г.

/>Приложение 1. (Листинг программы)

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

unit Unit1; // Интерфейс

interface

uses

  Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Unit2, Unit3, Unit4,Unit5, Unit6, Unit7, Unit8, Unit9, Menus, Unit11, Unit12, Unit13, Unit14,Unit15, Unit16, Unit17;

type

  TForm1 = class(TForm)

    Panel1: TPanel;

    Edit1: TEdit;

    Label1: TLabel;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button4: TButton;

    Panel2: TPanel;

    Label2: TLabel;

    Edit2: TEdit;

<p/>

    Button5: TButton;

    Button6: TButton;

    Button7: TButton;

    Button8: TButton;

    Panel3: TPanel;

    Label3: TLabel;

    Edit3: TEdit;

    Button9: TButton;

    Button10: TButton;

    Button11: TButton;

    Button12: TButton;

    Panel4: TPanel;

    Label4: TLabel;

    Edit4: TEdit;

    Button13: TButton;

    Button14: TButton;

    Button15: TButton;

    Button16: TButton;

    Panel5: TPanel;

    Label5: TLabel;

    Edit5: TEdit;

    Button17: TButton;

    Button18: TButton;

    Button19: TButton;

    Button20: TButton;

    Panel6: TPanel;

    Edit6: TEdit;

    Label6: TLabel;

    Button21: TButton;

    StatusBar1: TStatusBar;

    Image1: TImage;

    Image2: TImage;

    Image3: TImage;

    Image4: TImage;

    Image5: TImage;

    Button22: TButton;

    Memo1: TMemo;

    Label7: TLabel;

    Image6: TImage;

    Bevel1: TBevel;

    Panel7: TPanel;

    Button23: TButton;

    Button24: TButton;

    Button25: TButton;

    Button26: TButton;

    Edit7: TEdit;

    Image7: TImage;

    Label8: TLabel;

    Panel8: TPanel;

    Image8: TImage;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    Button27: TButton;

    Button28: TButton;

    Button30: TButton;

    Button29: TButton;

    Button31: TButton;

    Button32: TButton;

    N6: TMenuItem;

    N7: TMenuItem;

    N8: TMenuItem;

    N11: TMenuItem;

    N21: TMenuItem;

    N31: TMenuItem;

    N41: TMenuItem;

    N51: TMenuItem;

    N61: TMenuItem;

    N71: TMenuItem;

    Button33: TButton;

    N9: TMenuItem;

    procedure Button12Click(Sender: TObject);

    procedure Button11Click(Sender: TObject);

    procedure Button22Click(Sender: TObject);

    procedure Button21Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);

    procedure Button8Click(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action:TCloseAction);

    procedure Button15Click(Sender: TObject);

    procedure Button16Click(Sender: TObject);

    procedure Button20Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Button19Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button10Click(Sender: TObject);

    procedure Button9Click(Sender: TObject);

    procedure Button14Click(Sender: TObject);

    procedure Button13Click(Sender: TObject);

    procedure Button17Click(Sender: TObject);

    procedure Button18Click(Sender: TObject);

    procedure Button26Click(Sender: TObject);

    procedure Button25Click(Sender: TObject);

    procedure Button23Click(Sender: TObject);

    procedure Button24Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N4Click(Sender: TObject);

    procedure Button27Click(Sender: TObject);

    procedure Button30Click(Sender: TObject);

    procedure Button29Click(Sender: TObject);

    procedure Button31Click(Sender: TObject);

    procedure Button32Click(Sender: TObject);

    procedure N8Click(Sender: TObject);

    procedure N11Click(Sender: TObject);

    procedure Button33Click(Sender: TObject);

    procedure N21Click(Sender: TObject);

    procedure N31Click(Sender: TObject);

    procedure N41Click(Sender: TObject);

    procedure N51Click(Sender: TObject);

    procedure N61Click(Sender: TObject);

    procedure N71Click(Sender: TObject);

    procedure N9Click(Sender: TObject);

  private

  public

  end;

procedure DoNewEditList;

procedure DoNewEditListTwo;

procedure DoNewEditRoundList;

var

  Form1: TForm1;

  ListBegin: List;         //указатель на однонапр. список

  ListPos: Integer;        //позиция в однонапр. списке

  ListTwoBegin: ListTwo;   //указатель на двунапр. список

  ListTwoPos: Integer;     //позиция в двунапр. списке

  QueueBegin: List;        //указатель на очередь

  QueuePos: Integer;       //«позиция в очереди» (содержит кол-во символов в Editдо первого элемента)

  Stack: List;             //указатель на стек

  StackPos: Integer;       //«позиция в стеке» (содержит кол-во символов в Editдо первого элемента)

  DeckBegin, DeckEnd:ListTwo;         //указатели на начало и конец дека

  DeckBeginPos, DeckEndPos:Integer;   //«позиции в деке»  (DeckEndPos содержит кол-во символов в Editот DeckEndPosition до последнего элемента)

  DeckEndPosition: Integer;           //позиция последнего элемента в деке (содержит первоначальное кол-восимволов в Edit до последнего элемента)

  RoundList: List;         //указатель в циклическом списке

  RoundListPos: Integer;   //«позиция в циклическом списке»

implementation

uses O_programm, Help, Un18_Lab;

{$R *.DFM}

procedure DoNewEditList;

var

  q: List;

begin

  q := ListBegin;

  Form1.Edit1.Text := '';

  while q <> nil do

    begin

      Form1.Edit1.Text := Form1.Edit1.Text + ' ' +IntToStr(q^.Info);

      q := q^.Next;

    end;

end;

procedure DoNewEditListTwo;

var

  q: ListTwo;

begin

  q := ListTwoBegin;

  Form1.Edit2.Text := '';

  while q <> nil do

    begin

      Form1.Edit2.Text := Form1.Edit2.Text + ' ' +IntToStr(q^.Info);

      q := q^.Next;

    end;

end;

procedure DoNewEditRoundList;

var

  q: List;

begin

  q := RoundList^.Next;

  Form1.Edit7.Text := ' ' +IntToStr(RoundList^.Info);

  while q <> RoundList do

    begin

      Form1.Edit7.Text := Form1.Edit7.Text + ' ' +IntToStr(q^.Info);

      q := q^.Next;

    end;

end;

procedure TForm1.Button12Click(Sender: TObject);

var

  i, j: Integer;

  s: string;

begin

  StatusBar1.Panels[0].Text := '';

  GetQueue(QueueBegin);

  if QueueBegin <> nil then

    begin

      while Edit3.Text[QueuePos] <> ' ' doInc(QueuePos);

      Inc(QueuePos);

      s := Edit3.Text;

      for i := 1 to QueuePos — 1 do

        if s[i] <> ' ' then s[i] := ' ';

      Edit3.Text := s;

    end

  else

    begin

      ShowMessage('Очередь пуста');

      Edit3.Text := '';

      Image3.Hide;

      Button10.Enabled := False;

      Button11.Enabled := False;

      Button12.Enabled := False;

      StatusBar1.Panels[1].Text := 'Очередьпуста';

    end;

  Image3.Left := Round(QueuePos * 7);

end;

procedure TForm1.Button11Click(Sender: TObject);

begin

  StatusBar1Panels[0].Text := 'Нельзя !!!';

  Memo1.Lines.Add('В очерди нельзя возвращаться в начало т.к. указательуказывает сразу на начало;');

end;

procedure TForm1.Button22Click(Sender: TObject);

begin

  Application.Terminate;

end;

procedure TForm1.Button21Click(Sender: TObject);

var

  q: List;

  qTwo: ListTwo;

  qQueue, rQueue: List;

  Info: Integer;

  FlagList: Boolean;

  qStack: List;

  qDeckBegin, qDeckEnd: ListTwo;

  qRoundList: List;// начало циклич. списка

begin

  Button1.Enabled := True;

  Button2.Enabled := True;

  Button3.Enabled := True;

  Button4.Enabled := True;

  Button5.Enabled := True;

  Button6.Enabled := True;

  Button7.Enabled := True;

  Button8.Enabled := True;

  Button9.Enabled := True;

  Button10.Enabled := True;

  Button11.Enabled := True;

  Button12.Enabled := True;

  Button13.Enabled := True;

  Button14.Enabled := True;

  Button15.Enabled := True;

  Button16.Enabled := True;

  Button17.Enabled := True;

  Button18.Enabled := True;

  Button19.Enabled := True;

  Button20.Enabled := True;

  Button23.Enabled := True;

  Button24.Enabled := True;

  Button25.Enabled := True;

  Button26.Enabled := True;

  Image1.Visible := True;

  Image2.Visible := True;

  Image3.Visible := True;

  Image4.Visible := True;

  Image5.Visible := True;

  Image6.Visible := True;

  Image7.Visible := True;

  Edit1.Text := '';

  Edit2.Text := '';

  Edit3.Text := '';

  Edit4.Text := '';

  Edit5.Text := '';

  Edit7.Text := '';

  StatusBar1.Panels[0].Text := '';

  StatusBar1.Panels[1].Text := '';

  CreateLists;

  q := ListBegin;

  qTwo := ListTwoBegin;

  while q <> nil do

    begin

      Edit1.Text := Edit1.Text + ' ' +IntToStr(q^.Info);

      q := q^.Next;

    end;

  Image1.Left := 9;

  ListPos := 0;

  while qTwo <> nil do

    begin

      Edit2.Text := Edit2.Text + ' ' +IntToStr(qTwo^.Info);

      qTwo := qTwo^.Next;

    end;

  Image2.Left := 9;

  ListTwoPos := 0;

  FlagList := True;

  while QueueBegin <> nil do

    begin

      Info := GetQueue(QueueBegin);

      Edit3.Text := Edit3.Text + ' ' +IntToStr(Info);

      AddToQueue(Info, qQueue);

      if FlagList then

        begin

          FlagList := False;

          rQueue := qQueue;

        end;

    end;

  QueueBegin := rQueue;

  QueuePos := 2;

  Image3.Left := 9;

  while Stack <> nil do

    begin

      Info := GetStack(Stack);

      Edit4.Text := Edit4.Text + ' ' +IntToStr(Info);

      AddToStack(Info, qStack);

    end;

  Stack := qStack;

  Memo1.Lines.Add('В стеке числа идут на оборот т.к. элементы считываютсяиз конца стека.');

  StackPos := 2;

  Image4.Left := 9;

  while DeckEnd <> nil do

    begin

      Info := GetDeckEnd(DeckEnd);

      Edit5.Text := Edit5.Text + ' ' +IntToStr(Info);

      AddToDeck(Info, qDeckBegin, qDeckEnd, 0);

    end;

  DeckBegin := qDeckBegin;

  DeckEnd := qDeckEnd;

  DeckBeginPos := 2;

  Image5.Left := 9;

  Memo1.Lines.Add('Дек прочитывался с начала, поэтому элементы записалисьпо порядку.');

  DeckEndPosition := 1;

  while Edit5.Text[DeckEndPosition] <> '' doInc(DeckEndPosition);

  Image6.Left := Round(9 + DeckEndPosition * 6.2);

  Dec(DeckEndPosition);

  DeckEndPos := DeckEndPosition;

  qRoundList := RoundList^.Next;

  Edit7.Text := ' ' + IntToStr(RoundList^.Info);

  while qRoundList <> RoundList do

    begin

      Edit7.Text := Edit7.Text + ' ' +IntToStr(qRoundList^.Info);

      qRoundList := qRoundList^.Next;

    end;

  Image7.Left := 9;

  RoundListPos := 0;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

  Form3.Show;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

  StatusBar1.Panels[0].Text := 'Нельзя !!!';

  Memo1.Lines.Add('В однонаправленном списке нельзя перемещаться назад,т.к. связь существует толко в одну сторону;');

end;

procedure TForm1.Button4Click(Sender: TObject);

var

  qList: List;

  i, j: Integer;

begin

  StatusBar1.Panels[0].Text := '';

  qList := ListBegin;

  i := 0;

  while i <> ListPos do

    begin

      qList := qList^.Next;

      Inc(i);

    end;

  if qList <> nil then

    begin

      if qList^.Next <> nil thenInc(ListPos);

      i := 0;

      j := 0;

      while i < ListPos do

        begin

          Inc(j);

          if Edit1.Text[j] = ' ' then Inc(i);

        end;

      Image1.Left := Round(9 + (j + 1) * 7.5);

    end;

end;

procedure TForm1.Button7Click(Sender: TObject);

var

  qListTwo: ListTwo;

  i, j: Integer;

begin

  StatusBar1.Panels[0].Text := '';

  qListTwo := ListTwoBegin;

  i := 0;

  if ListTwoPos <> 0 then dec(ListTwoPos);

  i := 0;

  j := 0;

  while i < ListTwoPos do

    begin

      Inc(j);

      if Edit2.Text[j] = ' ' then Inc(i);

    end;

  if ListTwoPos = 0 then Image2.Left := 9

  else Image2.Left := Round(9 + (j + 1) * 7.5);

end;

procedure TForm1.Button8Click(Sender: TObject);

var

  qListTwo: ListTwo;

  i, j: Integer;

begin

  StatusBar1.Panels[0].Text := '';

  qListTwo := ListTwoBegin;

  i := 0;

  while i <> ListTwoPos do

    begin

      qListTwo := qListTwo^.Next;

      Inc(i);

    end;

  if qListTwo <> nil then

    begin

      if qListTwo^.Next <> nil then Inc(ListTwoPos);

      i := 0;

      j := 0;

      while i < ListTwoPos do

        begin

          Inc(j);

          if Edit2.Text[j] = ' ' then Inc(i);

        end;

      Image2.Left := Round(9 + (j + 1) * 7.5);

    end;

end;

procedure TForm1.FormClose(Sender: TObject; varAction: TCloseAction);

begin

  DestroyList(ListBegin);

  DestroyListTwo(ListTwoBegin);

  DestroyList(QueueBegin);

  DestroyList(Stack);

  DestroyListTwo(DeckBegin);

  Application.Terminate;

end;

procedure TForm1.Button15Click(Sender: TObject);

begin

  StatusBar1.Panels[0].Text := 'Нельзя !!!';

  Memo1.Lines.Add('В стеке нельзя возвращаться в начало т.к. указательуказывает сразу на начало;');

end;

procedure TForm1.Button16Click(Sender: TObject);

var

  i: Integer;

  s: string;

begin

  StatusBar1.Panels[0].Text := '';

  GetStack(Stack);

  if Stack <> nil then

    begin

      while Edit4.Text[StackPos] <> ' ' doInc(StackPos);

      Inc(StackPos);

      s := Edit4.Text;

      for i := 1 to StackPos — 1 do

        if s[i] <> ' ' then s[i] := ' ';

      Edit4.Text := s;

    end

  else

    begin

      ShowMessage('Стек пуст');

      Edit4.Text := '';

      Image4.Hide;

      Button14.Enabled := False;

      Button15.Enabled := False;

      Button16.Enabled := False;

      StatusBar1.Panels[1].Text := 'Стек пуст';

    end;

  Image4.Left := Round(StackPos * 7);

end;

procedure TForm1.Button20Click(Sender: TObject);

var

  i: Integer;

  s: string;

begin

  StatusBar1.Panels[0].Text := '';

  GetDeckBegin(DeckBegin);

  if DeckBegin <> nil then

    begin

      while Edit5.Text[DeckBeginPos] <> ' 'do Inc(DeckBeginPos);

      Inc(DeckBeginPos);

      s := Edit5.Text;

      for i := 1 to DeckBeginPos — 1 do

        if s[i] <> ' ' then s[i] := ' ';

      Edit5.Text := s;

    end;

  if (DeckBegin = nil) and (DeckBegin = DeckEnd)then

    begin

      ShowMessage('Дек пуст');

      Edit5.Text := '';

      Image5.Hide;

      Image6.Hide;

      Button18.Enabled := False;

      Button19.Enabled := False;

      Button20.Enabled := False;

      StatusBar1.Panels[1].Text := 'Дек пуст';

    end;

  Image5.Left := Round(DeckBeginPos * 7);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

  Windows.SetFocus(Button21.Handle);

end;

procedure TForm1.Button19Click(Sender: TObject);

var

  i, a: Integer;

  s: string;

begin

  StatusBar1.Panels[0].Text := '';

  GetDeckEnd(DeckEnd);

  if DeckEnd <> nil then

    begin

      while Edit5.Text[DeckEndPos] <> ' ' doDec(DeckEndPos);

      Dec(DeckEndPos);

      s := Edit5.Text;

      for i := DeckEndPosition downto DeckEndPos +1 do

        if s[i] <> ' ' then s[i] := ' ';

      Edit5.Text := s;

      //удаляем все пробелы конце строки

      s := '';

      i := Length(Edit5.Text) — 1;

      while Edit5.Text[i] = ' ' do Dec(i);

      for a := 1 to i do s := s + Edit5.Text[a];

      Edit5.Text := s;

    end;

  if (DeckEnd = nil) and (DeckBegin = DeckEnd)then

    begin

      ShowMessage('Дек пуст');

      Edit5.Text := '';

      Image5.Hide;

      Image6.Hide;

      Button19.Enabled := False;

      Button20.Enabled := False;

      StatusBar1.Panels[1].Text := 'Дек пуст';

    end;

  Image6.Left := Round(DeckEndPos * 7 — 9);

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

<p/>

  Form5.Show;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

  DeleteFromList(ListPos);

  DoNewEditList;

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

  DeleteFromListTwo(ListTwoPos);

  DoNewEditListTwo;

end;

procedure TForm1.Button10Click(Sender: TObject);

var

  i, a: Integer;

  s1, s2: string;

begin

  GetQueue(QueueBegin);

  if QueueBegin <> nil then

    begin

      i := QueuePos;

      while (Edit3.Text[i] <> ' ') and (i<= Length(Edit3.Text)) do Inc(i);

      Inc(i);

      s1 := '';

      s2 := '';

      for a := 1 to QueuePos — 1 do s1 := s1 +Edit3.Text[a];

      for a := i to Length(Edit3.Text) do s2 := s2+ Edit3.Text[a];

      Edit3.Text := s1 + s2;

    end;

end;

procedure TForm1.Button9Click(Sender: TObject);

begin

  Form4.Show;

end;

procedure TForm1.Button14Click(Sender: TObject);

var

  i, a: Integer;

  s1, s2: string;

begin

  GetStack(Stack);

  i := StackPos;

  while (Edit4.Text[i] <> ' ') and (i <=Length(Edit4.Text)) do Inc(i);

  Inc(i);

  s1 := '';

  s2 := '';

  for a := 1 to StackPos — 1 do s1 := s1 +Edit4.Text[a];

  for a := i to Length(Edit4.Text) do s2 := s2 +Edit4.Text[a];

  Edit4.Text := s1 + s2;

end;

procedure TForm1.Button13Click(Sender: TObject);

begin

  Form6.Show;

end;

procedure TForm1.Button17Click(Sender: TObject);

begin

  Form7.Show;

end;

procedure TForm1.Button18Click(Sender: TObject);

begin

  Form8.Show;

end;

procedure TForm1.Button26Click(Sender: TObject);

begin

  StatusBar1.Panels[0].Text := 'Нельзя !!!';

  Memo1.Lines.Add('В цикл. списке нельзя перемещаться назад, т.к. по сутицикл. список это однонаправ. список и следовательно связь существует только водну сторону;');

end;

procedure TForm1.Button25Click(Sender: TObject);

var

  qRoundList: List;

  i, j: Integer;

  Count: Integer;

begin

  StatusBar1.Panels[0].Text := '';

  qRoundList := RoundList^.Next;

  // Подсчет кол-ва елементов в списке

  Count := 1;

  while qRoundList <> RoundList do

    begin

      Inc(Count);

      qRoundList := qRoundList^.Next;

    end;

  qRoundList := RoundList;

  i := 0;

  while i <> RoundListPos do

    begin

      qRoundList := qRoundList^.Next;

      Inc(i);

    end;

  if qRoundList <> nil then

    begin

      if qRoundList^.Next <> nil thenInc(RoundListPos);

      if RoundListPos > Count — 1 thenRoundListPos := 0;

      i := 0;

      j := 0;

      while i < RoundListPos do

        begin

          Inc(j);

          if Edit7.Text[j] = ' ' then Inc(i);

        end;

      if RoundListPos = 0 then j := -1;

      Image7.Left := Round(9 + (j + 1) * 7.5);

    end;

end;

procedure TForm1.Button23Click(Sender: TObject);

begin

  Form9.Show;

end;

procedure TForm1.Button24Click(Sender: TObject);

begin

  if RoundList <> nil then

    begin

      DeleteFromRoundList(RoundListPos);

      if RoundList <> nil thenDoNewEditRoundList;

    end

  else

    begin

      Edit7.Text := '';

      ShowMessage('Циклический списокпуст');

      Button24.Enabled := False;

      Button25.Enabled := False;

      Button26.Enabled := False;

      Image7.Hide;

    end;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

  Close;

end;

procedure TForm1.N5Click(Sender: TObject);

begin

  AboutBox.Visible := True;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

  Form10.Visible := True;

end;

procedure TForm1.Button27Click(Sender: TObject);

begin

  Form11.Show;

end;

procedure TForm1.Button30Click(Sender: TObject);

begin

  Form12.Show;

end;

procedure TForm1.Button29Click(Sender: TObject);

begin

  Form13.Show;

end;

procedure TForm1.Button31Click(Sender: TObject);

begin

  Form14.Show;

end;

procedure TForm1.Button32Click(Sender: TObject);

begin

  Form15.Show;

end;

procedure TForm1.N8Click(Sender: TObject);

begin

  Form1.Hide;

  Form16.Show;

  N8.Enabled := False;

end;

procedure TForm1.N11Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №1.');

  Memo1.Lines.Add('                              «Списки»');

 Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Нажмите кнопку«Теория» для получения информации о списках.');

  Memo1.Lines.Add('   Внимательно изучите теоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. На листе формата А4,опишите ход проделанной работы.');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы.');

  Memo1.Lines.Add('   1) Что такое линейный список?');

  Memo1.Lines.Add('   2) Какие операции можно выполнить с линейнымсписком?');

  Memo1.Lines.Add('   3) Какие существую еще списки?');

  Memo1.Lines.Add('   4) Что представляет из себя связанноераспределение?');

  Memo1.Lines.Add('   5) Чем отличается связанное распределение отпоследовательного?');

  Memo1.Lines.Add('   6) Что такое динамические переменные? Функции new и nil.');

end;

procedure TForm1.Button33Click(Sender: TObject);

begin

  Form17.Show;

end;

procedure TForm1.N21Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №2.');

  Memo1.Lines.Add('       «Однонаправленный и двунаправленныйсписок»');

  Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Нажмите кнопку«Теория» для однонаправленного и ');

  Memo1.Lines.Add('   двунаправленного списка.');

  Memo1.Lines.Add('   Внимательно изучите теоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. Нажмите кнопку«Обновить» для формирования списков.');

  Memo1.Lines.Add('   Кнопки "<< и >>" служат дляперемещения курсора по списку.');

  Memo1.Lines.Add('   а) Переместитесь влево до 3, 5 и последнегоэлемента;');

  Memo1.Lines.Add('   б) Переместитесь вправо до первого элемента (см.коментарии);');

  Memo1.Lines.Add('   Кнопка «Добавить» служит для добавленияэлемента в список.');

  Memo1.Lines.Add('   а) Добавьте после 3, 5, 7 элемента цифру 33 в обоихсписках;');

  Memo1.Lines.Add('   б) Добавте 1-м и 3-м  элементом цифру 55 в двунаправленномсписке;');

  Memo1.Lines.Add('   Кнопка «Удалить» служит для удаленияэлемента из списка.');

  Memo1.Lines.Add('   а) Удалите 3, 5, 7 элементы в однонаправленномсписке;');

  Memo1.Lines.Add('   б) Удалите последний, 1 и 3 элементы вдвунаправленном;');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('3. На листе формата А4,опишите ход проделанной работы.');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы:');

  Memo1.Lines.Add('   1) Обратите внимание как перемещается курсор?');

  Memo1.Lines.Add('   2) Чем отличается однонаправленный и двунаправленныйсписки?');

  Memo1.Lines.Add('   3) Можно ли добавить элемент в любое место списка?');

  Memo1.Lines.Add('   4) Можно ли удалить любой элемент из списка?');

end;

procedure TForm1.N31Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №3.');

  Memo1.Lines.Add('                      «Циклический список»');

  Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Нажмите кнопку«Теория» для циклического списка?');

  Memo1.Lines.Add('   Внимательно изучите теоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. Нажмите кнопку«Обновить» для формирования списков.');

  Memo1.Lines.Add('   Кнопки "<< и >>" служат дляперемещения курсора по списку.');

  Memo1.Lines.Add('   а) Переместитесь вправо до 3, 5, последнего, первогоэлемента;');

  Memo1.Lines.Add('   б) Переместитесь влево (см. коментарии);');

  Memo1.Lines.Add('   Кнопка «Добавить» служит для добавленияэлемента в список.');

  Memo1.Lines.Add('   а) Добавьте 3, 5, 1-м элементами число 44;');

  Memo1.Lines.Add('   б) Добавьте после 2, 4, 1-го элемента число 0;');

  Memo1.Lines.Add('   Кнопка «Удалить» служит для удаленияэлемента из списка.');

  Memo1.Lines.Add('      Удалите 3, 5, 1, 4  элементы;');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('3. На листе формата А4,опишите ход проделанной работы.');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы:');

  Memo1.Lines.Add('   1) Обратите внимание как перемещается курсор?');

  Memo1.Lines.Add('   2) Какую ссылку имеет последний элемент циклическогосписка?');

  Memo1.Lines.Add('   3) Что называется головой и хвостом списка?');

end;

procedure TForm1.N41Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №4.');

  Memo1.Lines.Add('                            «Очередь»');

 Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Нажмите кнопку«Теория» для очереди.');

  Memo1.Lines.Add('   Внимательно изучите теоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. Нажмите кнопку«Обновить» для формирования списков.');

  Memo1.Lines.Add('   Кнопки "<< и >>" служат дляперемещения курсора по очереди.');

  Memo1.Lines.Add('   а) Переместитесь вправо до 3 элемента;');

  Memo1.Lines.Add('   б) Переместитесь влево (см. коментарии);');

  Memo1.Lines.Add('   Кнопка «Добавить» служит для добавленияэлемента в очередь.');

  Memo1.Lines.Add('   а) Добавьте 1, 4, 5-м элементами число 99;');

  Memo1.Lines.Add('   б) Добавьте последним число 999;');

  Memo1.Lines.Add('   Кнопка «Удалить» служит для удаленияэлемента из очереди.');

  Memo1.Lines.Add('      Удалите 1, 2, 3 элементы;');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('3. На листе формата А4,опишите ход проделанной работы.');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы:');

  Memo1.Lines.Add('   1) Как удаляется и добавляется элементы в очереди?');

  Memo1.Lines.Add('   2) В чем различие и сходство очереди иоднонаправленного списка?');

  Memo1.Lines.Add('   3) Что называется головой и хвостом очереди?');

  Memo1.Lines.Add('   4) Как располагаются элементы в очереди?');

end;

procedure TForm1.N51Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №5.');

  Memo1.Lines.Add('                              «Стек»');

<p/>

 Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Нажмите кнопку«Теория» для стека.');

  Memo1.Lines.Add('   Внимательно изучите теоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. Нажмите кнопку«Обновить» для формирования списков.');

  Memo1.Lines.Add('   Кнопки "<< и >>" служат для перемещениякурсора в стеке.');

  Memo1.Lines.Add('   а) Переместитесь вправо до 4 элемента;');

  Memo1.Lines.Add('   б) Переместитесь влево (см. коментарии);');

  Memo1.Lines.Add('   Кнопка «Добавить» служит для добавленияэлемента в стек.');

  Memo1.Lines.Add('      Добавьте 1, 3, 5 элементами число 22;');

  Memo1.Lines.Add('   Кнопка «Удалить» служит для удаленияэлемента из стека.');

  Memo1.Lines.Add('       Удалите 1, 3, 5, последний элементы;');

  Memo1.Lines.Add('3. На листе формата А4,опишите ход проделанной работы.');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы:');

  Memo1.Lines.Add('   1) Как удаляется и добавляется элементы в стек?');

  Memo1.Lines.Add('   2) Приведи примеры стека на практике?');

end;

procedure TForm1.N61Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №6.');

  Memo1.Lines.Add('                              «Дек»');

 Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Нажмите кнопку«Теория» для дека.');

  Memo1.Lines.Add('   Внимательно изучите теоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. Нажмите кнопку«Обновить» для формирования списков.');

  Memo1.Lines.Add('   Кнопки "<< и >>" служат дляперемещения курсора в деке.');

  Memo1.Lines.Add('   а) Переместитесь влево на 2 элемента;');

  Memo1.Lines.Add('   б Переместитесь вправо на 4 элемента;');

  Memo1.Lines.Add('   Кнопка «Добавить» служит для добавленияэлемента в дек.');

  Memo1.Lines.Add('   а) Добавьте 1, 3 элементом число 11;');

  Memo1.Lines.Add('   б) Добавьте 5, 6 элементом число 88;');

  Memo1.Lines.Add('   Кнопка «Удалить» служит для удаленияэлемента из дека.');

  Memo1.Lines.Add('   а) Удалите 2, 4 элементы;');

  Memo1.Lines.Add('   б) Добавте 6, 7 элементы;');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('3. На листе формата А4,опишите ход проделанной работы.');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы:');

  Memo1.Lines.Add('   1) Как удаляется и добавляется элементы в дек?');

  Memo1.Lines.Add('   2) В чем сходны и различны дек, стек идвунаправленный список?');

end;

procedure TForm1.N71Click(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Lines.Add('                      Лабораторная работа №7.');

  Memo1.Lines.Add('                              «Тест»');

 Memo1.Lines.Add('______________________________________________________________');

  Memo1.Lines.Add('1. Повторите весьтеоретический материал.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('2. Поработайте с демонстрационнойпрограммой.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('3. Запустите тест(сервис\тест или Ctrl + T).');

  Memo1.Lines.Add('   Ответьте на поставленные вопросы теста.');

  Memo1.Lines.Add('');

  Memo1.Lines.Add('4. Результаты тестасообщить преподавателю.');

end;

procedure TForm1.N9Click(Sender: TObject);

begin

  Form18.Show;

end;

end.

unit Unit2; //Формированиесписков

interface

uses SysUtils, Windows, Dialogs;

type

List = ^Spisok; //Однонаправленный

Spisok = record

           Info: Integer;

           Next: List;

         end;

ListTwo = ^SpisokTwo;  //Двунаправленный

SpisokTwo = record

              Info: Integer;

              Next: ListTwo;

              Prev: ListTwo;

            end;

procedure CreateLists;

procedure AddToList(X: Integer; varPointerEndList: List);

procedure AddToListAfterPos(X: Integer; Position:Integer);

procedure DeleteFromList(Position: Integer);

procedure AddToListTwo(X: Integer; varPointerEndListTwo: ListTwo);

procedure AddToListTwoAfterPos(X: Integer;Position: Integer);

procedure DeleteFromListTwo(Position: Integer);

procedure AddToQueue(X: Integer; varPointerEndQueue: List);

procedure AddToEndQueue(X: Integer);

function GetQueue(var PointerBegin: List):Integer;

procedure AddToStack(X: Integer; var PointerStack:List);

function GetStack(var PointerStack: List):Integer;

procedure AddToDeck(X: Integer;

           var PointerDeckBegin, PointerDeckEnd:ListTwo; Flag: Integer);

function GetDeckBegin(var PointerDeckBegin:ListTwo): Integer;

function GetDeckEnd(var PointerDeckEnd: ListTwo):Integer;

procedure DestroyList(PointerBegin: List);

procedure DestroyListTwo(PointerBegin: ListTwo);

procedure AddToRoundList(X: Integer; varPointerRoundList: List);

procedure DeleteFromRoundList(Position: Integer);

procedure DestroyRoundList(var PointerRoundList:List);

implementation

uses Unit1;

procedure DestroyList(PointerBegin: List);

var

  q: List;

begin

  while PointerBegin <> nil do

     begin

       q := PointerBegin;

       PointerBegin := PointerBegin^.Next;

       if q <> nil then Dispose(q);

     end;

end;

procedure DestroyListTwo(PointerBegin: ListTwo);

var

  q: ListTwo;

begin

  while PointerBegin <> nil do

     begin

       q := PointerBegin;

       PointerBegin := PointerBegin^.Next;

       if q <> nil then Dispose(q);

     end;

end;

procedure DestroyRoundList(var PointerRoundList:List);

var

  q, t: List;

begin

  q := PointerRoundList^.Next;

  PointerRoundList^.Next := nil;

  while q <> nil do

    begin

      t := q;

      q := q^.Next;

      if t <> nil then Dispose(t);

    end;

  PointerRoundList := nil;

end;

procedure AddToList(X: Integer; varPointerEndList: List); //Добавить элемент в

        //конец списка (PointerEnd- указатель на последний элемент списка)

begin

  if PointerEndList = nilthen  // Если первый элемент еще не существует

    begin

      New(PointerEndList);

      PointerEndList^.Info := X;

      PointerEndList^.Next := nil;

    end

  else

    begin

      New(PointerEndList^.Next);

      PointerEndList := PointerEndList^.Next;

      PointerEndList^.Info := X;

      PointerEndList^.Next := nil;

    end;

end;

procedure AddToListAfterPos(X: Integer; Position:Integer);

var                  //Добавить элемент всписок после Position

  i: Integer;

  q, qNew: List;

begin

  if Position = 0 then // Если позиция =0, то добавляем в начало

    begin

      New(qNew);

      qNew^.Info := X;

      qNew^.Next := ListBegin;

<p/>

      ListBegin := qNew;

    end

  else

    begin

      q := ListBegin;

      i := 0;

      while (i < Position) and (q <> nil)do // Ищем элемент после которого

                                             //нужно вставить

        begin

          q := q^.Next;

          Inc(i);

        end;

      if q <> nil then  // Если элемент существует то вставляем

        begin

          New(qNew);

          qNew^.Info := X;

          qNew^.Next := q^.Next;

          q^.Next := qNew;

        end

      else ShowMessage('Элемент, после которого хотите вставить,удален');

    end;

end;

procedure AddToRoundList(X: Integer; varPointerRoundList: List);

var qRound: List;

begin

  if PointerRoundList = nil then

    begin

      New(PointerRoundList);

      PointerRoundList^.Info := X;

      PointerRoundList^.Next := PointerRoundList;

      RoundList := PointerRoundList;

    end

  else

    begin

      New(qRound);

      qRound^.Info := X;

      qRound^.Next := PointerRoundList^.Next;

      PointerRoundList^.Next := qRound;

    end;

  PointerRoundList := PointerRoundList^.Next;

end;

procedure DeleteFromRoundList(Position: Integer);

var

  q, h: List;

  i: Integer;

begin

  if RoundList^.Next = RoundList then //одинэлемент в списке

    begin

      if RoundList <> nil thenDispose(RoundList);

      RoundList := nil;

    end

  else // не один элемент в списке

    begin

      i := 1;

      q := RoundList;

      while i < RoundListPos do

        begin

          Inc(i);

          q := q^.Next;

        end;

      if i <> 1 then

        begin

          h := q^.Next;

          q^.Next := h^.Next;

          if h <> nil then Dispose(h);

        end

      else

        begin

          q := RoundList^.Next;

          while q^.Next <> RoundList do q :=q^.Next;

          h := q^.Next;

          q^.Next := h^.Next;

          if h <> nil then Dispose(h);

          RoundList := q^.Next;

        end;

    end;

  if RoundList <> nil then

    begin

      q := RoundList^.Next;

      i := 1;

      while q <> RoundList do

        begin

          Inc(i);

          q := q^.Next;

        end;

      if i = RoundListPos then

        begin

          RoundListPos := 0;

          Form1.Image7.Left := 9;

        end;

    end;

end;

procedure DeleteFromList(Position: Integer); //Удаляетэлемент под

                                            //номером Position

var

  i: Integer;

  q, r: List;

begin

  q := ListBegin;

  if q <> nil then // Если список не пуст, то

    begin

      if Position = 0 then //Если позиция = 0,то удаляем первый элемент

        begin

          ListBegin := q^.Next;

          if q <> nil then Dispose(q);

        end

      else

        begin

          i := 0;

          while (i < Position — 1) and (q<> nil) do //Ищем элемент после

                                  //которогонужно удалить

            begin

              q := q^.Next;

              Inc(i);

            end;

         r := q^.Next;

         if r <> nil then //Если удаляемый элемент существует, то удаляем его

            begin

              q^.Next := r^.Next;

              if r <> nil then Dispose(r);

            end

          else ShowMessage('Элемент уже не существует');

        end;

    end

  else

    begin

      ShowMessage('Список пуст');

      Form1.Image1.Hide;

    end;

end;

procedure AddToListTwo(X: Integer; varPointerEndListTwo: ListTwo); //Добавить элемент в

        //конец дв-списка (PointerEnd — указатель на последний элемент списка)

begin

  if PointerEndListTwo = nil then //Если список еще не существуетили пуст,

                                  //добавляем в начало

    begin

      New(PointerEndListTwo);

      PointerEndListTwo^.Info := X;

      PointerEndListTwo^.Next := nil;

      PointerEndListTwo^.Prev := nil;

    end

  else

    begin

      New(PointerEndListTwo^.Next);

      PointerEndListTwo :=PointerEndListTwo^.Next;

      PointerEndListTwo^.Info := X;

      PointerEndListTwo^.Next := nil;

      PointerEndListTwo^.Prev := nil;

    end;

end;

procedure AddToListTwoAfterPos(X: Integer;Position: Integer);

var                  //Добавить элемент вдвунап. список после Position

  i: Integer;

  q, qNew: ListTwo;

begin

  if Position = 0 then //Если позиция = 0,вставляем в начало

    begin

      New(qNew);

      qNew^.Info := X;

      qNew^.Next := ListTwoBegin;

      ListTwoBegin := qNew;

    end

  else

    begin

      q := ListTwoBegin;

      i := 0;

      while (i < Position) and (q <> nil)do //Ищем элемент после которого

                                             //нужновставить

        begin

          q := q^.Next;

          Inc(i);

        end;

      if q <> nil then  // Если элемент существует то вставляем

        begin

          New(qNew);

          qNew^.Info := X;

          qNew^.Next := q^.Next;

          qNew^.Prev := q;

<p/>

          q^.Next := qNew;

        end

      else ShowMessage('Элемент, после которого хотите вставить,удален');

    end;

end;

procedure DeleteFromListTwo(Position: Integer);//Удаляет элемент

                                        //подномером Position

var

  i: Integer;

  q, r: ListTwo;

begin

  q := ListTwoBegin;

  if q <> nil then //Если удаляемый элемент существует, то

    begin

      if Position = 0 then //Если позиция = 0,то удаляем первый элемент

        begin

          ListTwoBegin^.Prev := nil;

          ListTwoBegin := q^.Next;

          if q <> nil then Dispose(q);

        end

      else

        begin

          i := 0;

          while (i < Position — 1) and (q<> nil) do //Ищем элемент

                     // после которогонужно удалить

            begin

              q := q^.Next;

              Inc(i);

            end;

          r := q^.Next;

          if r <> nil then //Если он существует, то удаляем его

            begin

              if r^.Next <> nil thenr^.Next^.Prev := q;

              q^.Next := r^.Next;

              if r <> nil then Dispose(r);

            end

          else ShowMessage('Элемент уже не существует');

        end;

    end

  else

    begin

      ShowMessage('Список пуст');

      Form1.Image2.Hide;

    end;

end;

procedure AddToQueue(X: Integer; varPointerEndQueue: List); //Добавить элемент

        //в конец очереди (PointerEnd — указатель на последний элемент очереди)

begin

  if PointerEndQueue = nil then //Если очередь еще несуществует или пуста

                                //добавляем в начало

    begin

      New(PointerEndQueue);

      PointerEndQueue^.Info := X;

      PointerEndQueue^.Next := nil;

    end

  else

    begin

      New(PointerEndQueue^.Next);

      PointerEndQueue := PointerEndQueue^.Next;

      PointerEndQueue^.Info := X;

      PointerEndQueue^.Next := nil;

    end;

end;

function GetQueue(var PointerBegin: List):Integer; //ф-ия получает элемент из

      // очереди и возвращает указатель наначало очереди

var

  rQueue: List;

<p/>

begin

  rQueue := PointerBegin;

  if rQueue <> nil then //Если очередь не пуста

    begin

      PointerBegin := PointerBegin^.Next;

      Result := rQueue^.Info;

      if rQueue <> nil then Dispose(rQueue);

    end

  else

    begin

      ShowMessage('Очередь пуста');

      Form1.Edit3.Text := '';

      Form1.Button10.Enabled := False;

      Form1.Button11.Enabled := False;

      Form1.Button12.Enabled := False;

      Form1.Image3.Hide;

    end;

<p/>

end;

procedure AddToEndQueue(X: Integer);

<p/>

var

  Info: Integer;

  rQueue, qQueue: List;

  FlagList: Boolean;

begin

  FlagList := True; //Для выделения первогоэлемента

  qQueue := nil;

  rQueue := nil;

  while QueueBegin <> nil do //Ищем указатель на последнийэлемент очереди

    begin

      Info := GetQueue(QueueBegin);

      AddToQueue(Info,rQueue); //Формируем новую очередь из элементов старой

                                //очереди, чтобы не потерять ее

      if FlagList then       /////////////////////////////////////

        begin                //                                 //

          qQueue := rQueue;  // формируем указатель на очередь  //

          FlagList := False; //                                 //

        end;                  ////////////////////////////////////

    end;

  AddToQueue(X, rQueue);

  if qQueue <> nil then QueueBegin := qQueue// определяем указатель на очередь

  else QueueBegin := rQueue;                //////////////////////////////////

<p/>

end;

procedure AddToStack(X: Integer; var PointerStack:List); //Добавить элемент в

        //стек (PointerStack- указатель на стек)

var

  Stacks: List;

begin

  if PointerStack = nil then //Если стек пуст, тоформируем его

    begin

      New(PointerStack);

      PointerStack^.Info := X;

<p/>

      PointerStack^.Next := nil;

    end

  else //иначе добавляем элемент

    begin

      New(Stacks);

      Stacks^.Info := X;

      Stacks^.Next := PointerStack;

      PointerStack := Stacks;

    end;

end;

function GetStack(var PointerStack: List):Integer; //ф-ия получает элемент из

      // стека и возвращает указатель настек

var

  rStack: List;

begin

  rStack := PointerStack;

  if rStack <> nil then //Если стек еще не пуст

    begin

      PointerStack := PointerStack^.Next;

      Result := rStack^.Info;

      if rStack <> nil then Dispose(rStack);

    end

  else

    begin

      ShowMessage('Стек пуст');

      Form1.Button14.Enabled := False;

      Form1.Image4.Hide;

    end;

end;

procedure AddToDeck(X: Integer; varPointerDeckBegin, PointerDeckEnd: ListTwo;

           Flag: Integer);//Добавить элемент в дек

                           //PointerDeckBegin- указатель на начало дека

                           //PointerDeckEnd- указатель на конец дека

var

  Decks: ListTwo;

begin

  if PointerDeckBegin = nil then //Если дек пуст,то формируем его

    begin

      New(PointerDeckBegin);

      PointerDeckBegin^.Info := X;

      PointerDeckBegin^.Next := nil;

      PointerDeckBegin^.Prev := nil;

      PointerDeckEnd := PointerDeckBegin;

    end

  else //иначе добавляем элемент

    begin

      if Flag = 0 then  //добавляем в начало

        begin

          New(Decks);

          Decks^.Info := X;

          Decks^.Next := PointerDeckBegin;

          Decks^.Prev := nil;

          PointerDeckBegin^.Prev := Decks;

          PointerDeckBegin := Decks;

        end

      else  //добавлям в конец

        begin

          New(Decks);

          Decks^.Info := X;

          Decks^.Next := nil;

          Decks^.Prev := PointerDeckEnd;

          PointerDeckEnd^.Next := Decks;

          PointerDeckEnd := Decks;

        end;

    end;

end;

function GetDeckBegin(var PointerDeckBegin:ListTwo): Integer;

   //ф-ия получает элемент из начала дека ивозвращает указатель на начало дека.

var

  q: ListTwo;

begin

  if PointerDeckBegin <> nil then //Если декне пуст

    begin

      Result := PointerDeckBegin^.Info;

      q := PointerDeckBegin;

      PointerDeckBegin := q^.Next;

      if PointerDeckBegin <> nil thenPointerDeckBegin^.Prev := nil;

      if q <> nil then Dispose(q);

    end

  else

    begin

      ShowMessage('Дек пуст');

      Form1.Edit5.Text := '';

      Form1.Button18.Enabled := False;

      Form1.Button19.Enabled := False;

      Form1.Button20.Enabled := False;

      Form1.Image5.Hide;

      Form1.Image6.Hide;

    end;

end;

function GetDeckEnd(var PointerDeckEnd: ListTwo):Integer;

   //ф-ия получает элемент из конца дека ивозвращает указатель на конец дека.

var

  q: ListTwo;

begin

  if PointerDeckEnd <> nil then //Если декне пуст

    begin

      Result := PointerDeckEnd^.Info;

      q := PointerDeckEnd;

      PointerDeckEnd := q^.Prev;

      if PointerDeckEnd <> nil thenPointerDeckEnd^.Next := nil;

      if q <> nil then Dispose(q);

    end

  else

    begin

      ShowMessage('Дек пуст');

      Form1.Edit5.Text := '';

      Form1.Button18.Enabled := False;        

      Form1.Button19.Enabled := False;

      Form1.Button20.Enabled := False;

      Form1.Image5.Hide;

      Form1.Image6.Hide;

    end;

end;

procedure CreateLists; //процедура создания всехсписков

var

  i: Integer;

  X: Integer;

  Uk, q: List;

  UkTwo, qTwo: ListTwo;

  UkQueue, qQueue: List;

  qStack: List;

  qDeckBegin, qDeckEnd: ListTwo;

begin

  X := Random(101);//Определяем значение первого элемента

  Uk := nil;            //////////////////////////

  q := nil;             //                      //

  UkTwo := nil;        // НАЧАЛЬНЫЕ УСТАНОВКИ: //

  qTwo := nil;         //                      //

  UkQueue := nil;      // все указатели = nil  //

  qQueue := nil;        //                      //

  qStack := nil;        //                      //

  qDeckBegin := nil;    //                      //

  qDeckEnd := nil;      //////////////////////////

// Destroy for every lists

  if ListBegin <> nil then DestroyList(ListBegin);

  if ListTwoBegin <> nil thenDestroyListTwo(ListTwoBegin);

  if QueueBegin <> nil thenDestroyList(QueueBegin);

  if Stack <> nil then DestroyList(Stack);

  if DeckBegin <> nil thenDestroyListTwo(DeckBegin);

  if RoundList <> nil thenDestroyRoundList(RoundList);

  AddToList(X, Uk);                        //

  AddToListTwo(X, UkTwo);                  // Добавляем Х в

  AddToQueue(X, UkQueue);                  // каждый список

  AddToStack(X, qStack);                   //

  AddToDeck(X, qDeckBegin, qDeckEnd, 0);   //

  AddToRoundList(X, RoundList);           ///////////////////

  Unit1.Form1.Edit6.Text := IntToStr(X);

  q := Uk;           //

  qTwo := UkTwo;     // Формируем указатели на начало списков

  qQueue := UkQueue; //

  for i :=  to 9 do       //Дальнейшее формирование списков

    begin

      X := Random(101);

      AddToList(X, q);

      AddToListTwo(X, qTwo);

      AddToQueue(X, qQueue);

      AddToStack(X, qStack);

      AddToDeck(X, qDeckBegin, qDeckEnd, 0);

      AddToRoundList(X, RoundList);

      Unit1.Form1.Edit6.Text :=Unit1.Form1.Edit6.Text + ' ' + IntToStr(X);

    end;

  ListBegin := Uk;         //////////////////////////////////////

  ListTwoBegin := UkTwo;   //                                  //

  QueueBegin := UkQueue;   //                                  //

  Stack := qStack;         //  Определяем указатели все списки //

  DeckBegin := qDeckBegin; //                                  //

  DeckEnd := qDeckEnd;     //                                  //

  RoundList := RoundList^.Next //////////////////////////////////

end;

end.

unit Unit16; //Тест

interface

uses

  Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs,

  StdCtrls, ExtCtrls;

type

  TForm16 = class(TForm)

    Memo1: TMemo;

    Panel1: TPanel;

    Button1: TButton;

    RadioGroup1: TRadioGroup;

    Button2: TButton;

    procedure RadioGroup1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure FormClose(Sender: TObject; varAction: TCloseAction);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form16: TForm16;

  NumberQuestion: Integer = 0;

  NumberTrueAnswer: Integer = 0;

  ff: Boolean = True;

implementation

uses Unit1, Un18_Lab;

{$R *.DFM}

procedure TForm16.RadioGroup1Click(Sender:TObject);

begin

  Button1.Enabled := True;

  Button1.SetFocus;

end;

procedure TForm16.Button2Click(Sender: TObject);

begin

  Form16.Hide;

  Form1.Show;

end;

procedure TForm16.Button1Click(Sender: TObject);

begin

  Memo1.Lines.Clear;

  Button1.Enabled := False;

  Inc(NumberQuestion);

  case NumberQuestion of

    1:

      begin

        if RadioGroup1.ItemIndex = 0 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Однонаправленный список — это ...');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('Список, элементы которого имеют связь со следующим ипредыдущим элементом');

        RadioGroup1.Items.Add('Список, элементы которого имеют связь со следующимэлементом');

        RadioGroup1.Items.Add('Список, элементы которого не имеют связи');

      end;

    2:

      begin

        if RadioGroup1.ItemIndex = 1 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Если элемент содержит ссылки на следующий и предыдущийэлемент, то это ...');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('однонаправленный список');

        RadioGroup1.Items.Add('двунаправленный список');

        RadioGroup1.Items.Add('очередь');

        RadioGroup1.Items.Add('стек');

        RadioGroup1.Items.Add('дек');

        RadioGroup1.Items.Add('циклическийсписок');

      end;

    3:

      begin

        if RadioGroup1.ItemIndex = 1 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Куда добавляется элемент в двунаправленный список?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('В начало');

        RadioGroup1.Items.Add('В конец');

        RadioGroup1.Items.Add('В любое другое место');

      end;

    4:

      begin

        if RadioGroup1.ItemIndex = 2 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Чем отличается однонаправленный список отдвунаправленного?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('Существует связь с предыдущим элементом');

        RadioGroup1.Items.Add('Не существует связь с предыдущим элементом');

        RadioGroup1.Items.Add('Не отличаются');

      end;

    5:

      begin

        if RadioGroup1.ItemIndex = 1 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Какой элемент считывается из стека?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('Последний');

        RadioGroup1.Items.Add('Любой');

        RadioGroup1.Items.Add('Первый');

      end;

    6:

      begin

        if RadioGroup1.ItemIndex = 0 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Чем отличается дек от стека?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('Добавление в любом место. Удаление из начала');

        RadioGroup1.Items.Add('Добавление в начало. Удаление из любого места');

        RadioGroup1.Items.Add('Все включения исключения происходят на обоих егоконцах');

      end;

    7:

      begin

        if RadioGroup1.ItemIndex = 2 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Откуда считывается элемент из очереди?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('С конца');

        RadioGroup1.Items.Add('С начала');

        RadioGroup1.Items.Add('Из люього места');

      end;

    8:

      begin

        if RadioGroup1.ItemIndex = 1 thenInc(NumberTrueAnswer);

        Memo1.Lines.Add('Куда добавляется элемент в стек?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('В конец');

        RadioGroup1.Items.Add('В начало');

        RadioGroup1.Items.Add('В любое место');

      end;

    9:

      begin

        if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);

        Memo1.Lines.Add('Какую ссылку содержит последний элементциклического списка?');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('На первый элемент');

        RadioGroup1.Items.Add('На предыдущий элемент');

        RadioGroup1.Items.Add('NIL');

      end;

    10:

      begin

        if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);

        Memo1.Lines.Add('Если все включения и исключения происходятна одном конце списка, то это ...');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('однонаправленный список');

        RadioGroup1.Items.Add('двунаправленный список');

        RadioGroup1.Items.Add('очередь');

        RadioGroup1.Items.Add('стек');

        RadioGroup1.Items.Add('дек');

        RadioGroup1.Items.Add('циклический список');

      end;

    11:

      begin

        if RadioGroup1.ItemIndex = 3 then Inc(NumberTrueAnswer);

        Memo1.Lines.Add('Если последний элемент имеет ссылкуна первый элемент, то это ...');

        RadioGroup1.Items.Clear;

        RadioGroup1.Items.Add('однонаправленный список');

        RadioGroup1.Items.Add('двунаправленный список');

        RadioGroup1.Items.Add('очередь');

        RadioGroup1.Items.Add('стек');

        RadioGroup1.Items.Add('дек');

        RadioGroup1.Items.Add('циклическийсписок');

      end;

    12:

      begin

        if RadioGroup1.ItemIndex = 5 thenInc(NumberTrueAnswer);

        Button1.Hide;

        if NumberTrueAnswer >= 10 thenShowMessage('Ваша оценка — ОТЛИЧНО!');

        if (NumberTrueAnswer >= 8) and(NumberTrueAnswer < 10) then ShowMessage('Ваша оценка — ХОРОШО!');

        if (NumberTrueAnswer >= 6) and(NumberTrueAnswer < 8) then ShowMessage('Ваша оценка — ТРИ!');

        if NumberTrueAnswer < 6 then

          begin

            ShowMessage('Тебе однозначнонужно почитать теорию. Твоя оценка — Два!!!');

            ff := False;

          end;

        Form16.Hide;

        Form1.Show;

        if not ff then Form18.Show;

      end;

  end;

end;

procedure TForm16.FormClose(Sender: TObject; varAction: TCloseAction);

begin

  Form16.Hide;

  Form1.Show;

  if not ff then Form18.Show;

end;

end.

еще рефераты
Еще работы по информатике, программированию