Ссылочные реализации структур данных
Большинство структур данных реализуется на базе массива. Все реализации
можно разделить на два класса: непрерывные и ссылочные. В непрерывных реализациях
элементы структуры данных располагаются последовательно друг за другом в
непрерывном отрезке массива, причем порядок их расположения в массиве
соответствует их порядку в реализуемой структуре. Рассмотренные выше реализации
очереди и стека относятся к непрерывным.
В ссылочных реализациях элементы структуры данных хранятся в произвольном
порядке. При этом вместе с каждым элементом хранятся ссылки на один или несколько
соседних элементов. В качестве ссылок могут выступать либо индексы ячеек массива,
либо адреса памяти.
Ссылочные реализации обладают двумя ярко выраженными недостатками: 1) для
хранения ссылок требуется дополнительная память; 2) для доступа к некоторому
элементу структуры необходимо сначала добраться до него, проходя последовательно по
цепочке других элементов. Казалось бы, зачем нужны такие реализации?
Все недостатки ссылочных реализаций компенсируются одним чрезвычайно
важным достоинством: в них можно добавлять и удалять элементы в середине структуры
данных, не перемещая остальные элементы.
Массовые операции
Массовые операции — это операции, затрагивающие значительную часть всех
элементов структуры данных. Пусть нужно добавить или удалить один элемент. Если при
этом приходится, например, переписывать значительную часть остальных элементов с
одного места на другое, то говорят, что добавление или удаление приводит к массовым
операциям. Массовые операции — это бедствие для программиста, то, чего он всегда
стремится избежать. Хорошая реализация структуры данных — та, в которой массовых
операций либо нет совсем, либо они происходят очень редко. Например, добавление
элемента должно выполняться за ограниченное число шагов, независимо от того,
содержит ли структура десять или десять тысяч элементов.
В непрерывных реализациях добавление или удаление элементов в середине
структуры неизбежно приводит к массовым операциям. Поэтому структуры, в которых
можно удалять или добавлять элементы в середине, обязательно должны быть
реализованы ссылочным образом.
Списки
Классический пример структуры данных последовательного доступа, в которой
можно удалять и добавлять элементы в середине структуры, — это линейный список.
Списком называется некоторая последовательность элементов, связанных при
помощи указателей.
Различают однонаправленный и двунаправленный списки (иногда говорят
односвязный и двусвязный).
Элементы списка как бы выстроены в цепочку друг за другом. У списка есть начало
и конец. Имеется также указатель списка, который располагается между элементами.
Если мысленно вообразить, что соседние элементы списка связаны между собой
веревкой, то указатель — это ленточка, которая вешается на веревку. В любой момент
времени в списке доступны лишь два элемента — элементы до указателя и за
указателем.
В однонаправленном списке указатель можно передвигать лишь в одном
направлении — вперед, в направлении от начала к концу. Кроме того, можно установить