
А9. Добавить элемент в упорядоченный односвязный список
(сохранив упорядоченность)
Procedure
InSortList(indata:TData); var p,
pnext, pnew : plist; begin
new(pnew);
pnew^.data
:= indata; if
(Head=NIL)
or
(Head^.data > indata) then
begin
{добавить
элемент в начало списка}
pnew^.next
:= Head; Head
:= pnew; end else
begin p
:= Head; pnext
:= p^.next; while
(pnext <> NIL) and
(pnext^.data < indata) do
begin p
:= p^.next;
pnext
:= pnext^.next;
{включить
элемент}
pnew^.next
:= pnext;
p^.next
:= pnew; end; end; end;
Дополнительные сведения по организации и работе со списками рекомендуется получить из учебной литературы по программированию на Паскале, в частности, рекомендованной для данного курса.
В заключение отметим, что в данном разделе рассматриваются только процедуры New и Dispose, обеспечивающие работу с памятью на логическом уровне, т.е. с переменными, типы которых в программе явно объявлены. Отсюда при выполнении процедуры New(P) выделяется столько байт памяти, каков размер, занимаемый переменной Р, и этот объем вычисляется автоматически.
Еще раз повторим, что процедуры GetMem и FreeMem обеспечивают работу с данными, типы которых им безразличны. Они оперируют с памятью в байтах. Поэтому, при их использовании, вычислять требуемые объемы памяти должен программист. Примеры использования указанных процедур приводятся при рассмотрении работы со структурами (record) и файлами.
Задачи для закрепления материала
Для закрепления материала предлагается решить следующие задачи:
Задача 1. Имеются две последовательность строк, в каждой из которых размещаются списки фамилий. Признак окончания последовательности – пустая строка. Последовательности могут вводиться из файла или с клавиатуры. Сформировать два однонаправленных линейных списка, поместив в каждый содержимое своей последовательности. Затем сравнить списки, и в качестве результата, после слов «Результат:», вывести одно из приведенных ниже сообщений:
«Списки совпадают»
«Первый список включает второй» (если второй список совпадает с началом первого)
«Второй список включает первый»
«Списки не совпадают» (в остальных случаях).
Алгоритмы заполнения списков и их сравнения оформить в виде подпрограмм.
Задача 2. Дана строка символов. Найти и вывести все подстроки, заключенные в круглые скобки.
Порядок вывода: после строки со словом «Результат:» вывести в отдельных строках все найденные подстроки. Если одна подстрока является частью другой, то сначала вывести более короткую.
Пример:
Исходная
строка: ((4+6)*7)+(6*(8+7)) Результат: 4+6 (4+6)*7 8+7 6*(8+7)
Вопросы для самоконтроля
В чем особенность объявления динамических переменных?
Что такое указатель и для чего он нужен?
Какие процедуры используются для создания и уничтожения динамических переменных?
Какие значения может принимать переменная типа «указатель»?
В чем сходство и различие между линейным и упорядоченным списками?
Какова структура элемента двухсвязного списка?
Чем отличаются и что объединяет структуры данных «список» и «очередь»?
В чем состоит особенность описания типов для создания динамических структур данных?
Сколько указателей требуется для создания очереди?
Какие действия необходимо выполнить для создания очереди?
Как добавить или удалить элемент очереди?