такие списки несколько труднее использовать, но зато одни и те же элементы могут
встречаться более чем в одном списке одновременно.
Кроме того, что списки годятся для ситуации, когда происходят удаления и вставки
элементов в середине, они также хороши для управления данными меняющегося
размера, особенно когда доступ к ним происходит по принципу
стека: последним
вошел, первым вышел (last in, first out — LIFO). Они используют память
эффективнее, чем массивы, при наличии нескольких стеков, которые независимо
друг от друга растут и уменьшаются. Они также хороши в случае, когда информация
внутренне связана в цепочку неизвестного заранее размера, например как
последовательность слов в документе. Однако если вам нужны как частые
обновления,
так и случайный доступ к данным, то разумнее будет использовать не
такую непреклонно линейную структуру данных, а что-нибудь вроде дерева или хэш-
таблицы.
Упражнение 2-7
Реализуйте некоторые другие операции над списком: копирование, слияние,
разделение списка, вставку до или после указанного элемента. Как эти две операции
вставки отличаются по сложности? Много ли
вы можете использовать из того, что мы
написали, и много ли вам надо написать самому?
Упражнение 2-8
Напишите рекурсивную и итеративную версии процедуры reverse,
переворачивающей список. Не создавайте новых элементов списка; используйте
старые.
Упражнение 2-9
Напишите обобщенный тип List для языка С. Простейший способ — в каждом
элементе списка хранить указатель void *, который ссылается на данные.
Сделайте
то же для C++, используя шаблон (template), и для Java, определив класс,
содержащий списки типа Obj ect. Каковы сильные и слабые стороны этих языков с
точки зрения данной задачи?
Упражнение 2-10
Придумайте и реализуйте набор тестов для проверки того, что написанные вами
процедуры работы со списками корректны. Стратегии тестирования подробнее
обсуждаются в главе 6.
Деревья
Дерево — иерархическая структура данных, хранящая набор элементов. Каждый
элемент имеет значение и может указывать на ноль или более других элементов. На
каждый элемент указывает только один другой элемент. Единственным
исключением является корень дерева, на который не указывает ни один элемент.
Входящие в дерево элементы называются его вершинами.
Есть много типов деревьев
, которые отражают сложные структуры, например
деревья синтаксического разбора (parse trees), хранящие синтаксис предложения
или программы, либо генеалогические деревья, описывающие родственные связи.
Мы продемонстрируем основные принципы на деревьях двоичного поиска, в которых