- Связанные списки ;

Связный список является простейшим типом данных динамической структуры, состоящей из элементов (узлов). Каждый узел включает в себя в классическом варианте два поля:

* данные (в качестве данных может выступать переменная, объект класса или структуры и т. д.)
* указатель на следующий узел в списке.

Элементы связанного списка можно помещать и исключать произвольным образом.

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

Связаные списки имеют несколько основных преимущств:

* элементы могут быть добавлены или удалены из середины списка
* нет необходимости объявления размера при инициализации

Но имеют и недостатки:

* связанные списки не имеют возможности рандомного доступа к элементам — т.е. нет возможности получить элемент внутри списка, без того что бы пройтись по всем элементам до него
* для работы списков требуется динамическое выделение памяти и указатели, что усложняет код и может привести к утечкам памяти
* связанные списки требуют больше ресурсов операционной системы, т.к. их элементы выделяются динимачески и каждый элемент должен хранить дополнительный указатель

### Реализация

Связанный список — это коллекция динамически выделяемых *нод* (элементов списка), организованных таким образом, что каждая нода содержит одно значение и один указатель. Указатель в ноде всегда указывает на следующий член списка. Если указатель == NULL — это последняя нода в списке.

## Классификация списков

**По количеству полей указателей** различают однонаправленный (односвязный) и двунаправленный (двусвязный) списки.

Связный список, содержащий только один указатель на следующий элемент, называется односвязным.
Связный список, содержащий два поля указателя – на следующий элемент и на предыдущий, называется двусвязным.

**По способу связи элементов** различают линейные и циклические списки.

Связный список, в котором, последний элемент указывает на NULL, называется линейным.
Связный список, в котором последний элемент связан с первым, называется циклическим.

## Виды списков

Таким образом, различают 4 основных вида списков.

* Односвязный линейный список (ОЛС).
Каждый узел ОЛС содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит нулевое значение (указывает на NULL).
* Односвязный циклический список (ОЦС).
Каждый узел ОЦС содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит адрес первого узла (корня списка).
* Двусвязный линейный список (ДЛС).
Каждый узел ДЛС содержит два поля указателей: на следующий и на предыдущий узел. Поле указателя на следующий узел последнего узла содержит нулевое значение (указывает на NULL). Поле указателя на предыдущий узел первого узла (корня списка) также содержит нулевое значение (указывает на NULL).
* Двусвязный циклический список (ДЦС).
Каждый узел ДЦС содержит два поля указателей: на следующий и на предыдущий узел. Поле указателя на следующий узел последнего узла содержит адрес первого узла (корня списка). Поле указателя на предыдущий узел первого узла (корня списка) содержит адрес последнего узла.

## Сравнение массивов и связных списков

 При удалении/добавлении элемента требуется копирование всех последующих элементов для осуществления их сдвига
 Для хранения элемента требуется объем памяти, необходимый только для хранения данных этого элемента
 Доступ к элементам может осуществляться в произвольном порядке