Массивы и связные списки
Массивы и связные списки
Связные списки используются, когда требуется структура данных, размер которой заранее неизвестен. В такие списки можно добавлять и удалять элементы уже после создания самого списка. Однако такой список требует дополнительных усилий для поддержания целостности при динамических операциях, так как при удалении элемента из списка обрывается связь между элементами, находящимися до и после него, и эти элементы необходимо снова связать между собой. В листинге 1 представлен массив из 100 элементов и инициализируются его первые 3 значения.
Физически все 100 элементов располагаются в памяти последовательно, и индекс элемента - это смещение в блоке памяти от его начала, поэтому извлечение элемента по индексу выполняется крайне быстро. Это и есть адресная арифметика, но так как память для стандартного массива выделяется на этапе компиляции, то и модифицировать его впоследствии уже нельзя. Для выделения памяти для связного списка используется иной механизм, когда память выделяется динамически, во время работы программы. Данный тип памяти называется «куча» (heap) и добавляемые элементы физически могут располагаться в такой куче безвсякого упорядочивания. Каждый элемент связного списка представляет собой отдельный объект, содержащий поле для хранения информации и указатель на следующий элемент списка (а в случае двусвязного списка в объекте хранится также указатель на предыдущий элемент). Схема, изображающая связный и двусвязный списки из трех элементов: Списки бывают линейными и кольцевыми, односвязными и двусвязными. Передвижение по списку осуществляется по указателям, которые указывают на соседние элементы списка. При добавлении нового элемента к списку необходимо: 1. динамически выделить под него память и 2. присвоить соответствующие значения указателям соседних элементов, 3. а также указателям самого созданного элемента.
|