Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по лабораторной работе №2.doc
Скачиваний:
41
Добавлен:
02.05.2014
Размер:
108.03 Кб
Скачать

2.2.Рекурсия при обработке односвязного списка.

Даже такая простая структура, как динамический односвязный список, представляет собой конструкцию вложенных списков, как показано на рисунке 2. На нем собственно данные или содержательные элементы обозначены D, а связи между записями или указатели обозначены L.

список

список

список

список

. . .

Рисунок 2 Рекурсивное представление односвязного списка

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

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

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

Функция рекурсивного заполнения списка ниже в программе имеет прототип:

struct cell * input (void) ;

Она возвращает указатель на сформированный динамический список, заполненный вводимыми с клавиатуры дисплея данными. Предполагается, что при каждом вызове этой функции формируется новый список. Функция заканчивает работу, если для очередного звена списка введено нулевое значение переменной weight. В противном случае заполненная с клавиатуры структура подключается к списку, а ее элементу struct cell *рс присваивается значение, которое вернет функция input(), рекурсивно вызванная из тела функции. После этого функция возвращает адрес очередного звена списка, т.е. значение указателя struct cell * рс.

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

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

2. Выделение памяти для звеньев списка и заполнение значениями элементов звеньев (структур) зависит от тех значений, которые пользователь присваивает элементам.

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

4. Если нулевое значение элемента weight введено для первого звена списка, то функция input( ) возвращает значение NULL.

5. Список определяется рекурсивно как первое (головное) звено, за которым следует присоединяемый к нему список.

6. Псевдокод рекурсивного алгоритма формирования списка:

Если введены терминальные данные для звена

Освободить память, выделенную для звена

Вернуть нулевой указатель

Иначе:

Элементу связи звена присвоить результат формирования продолжения списка (использовать тот же алгоритм)