Связный список — набор элементов, каждый из которых
структурно состоит из двух частей — содержательной и связующей.
Содержательная часть представляет собой собственно данные или указатель
на область памяти, где эти данные
содержатся. Связующая часть предназначена для связи элементов в
списке и определяет очередность их следования. Благодаря связующей части
в каждом из элементов становятся возможными «путешествия» по списку
путем последовательных переходов от одного элемента к другому.
В отличие от последовательного списка связный список относится к
динамическим структурам данных. Для них характерны непредсказуемость в
числе элементов, которое может быть нулевым, а может и ограничиваться
объемом доступной памяти. Другая характеристика связного списка —
необязательная физическая смежность элементов в памяти.
Относительно связующей части различают следующие типы связных списков.
- Односвязный список — список, начало которого определяется указателем начала, а каждый элемент списка содержит указатель на следующий элемент. Последний элемент должен содержать признак конца списка или указатель на первый элемент списка. В последнем случае мы имеем одно-связный кольцевой список. Преимущество последнего состоит в том, что просмотр всех элементов списка можно начинать с любого элемента, а не только с головы. Более того, в случае кольцевого односвязного списка указателем его начала может быть любой элемент списка. Этот вид списка всегда линейный, так как однозначно задает порядок своего просмотра.
- Двусвязный список — список, связующая часть которого состоит из двух указателей — на предыдущий и последующий элементы. Начало и конец списка определяются отдельными указателями. Последние элементы дву-связного списка в каждом из направлений просмотра содержат признаки конца. Если замкнуть эти указатели друг на друга, то мы получим кольцевой двусвязный список. В этом случае потребность в указателе конца списка отпадает. Этот вид списка может быть как линейным (иметь одинаковый порядок просмотра в обоих направлениях), так и нелинейным (второй указатель каждого элемента списка задает порядок просмотра, который не является обратным порядку, устанавливаемому первым указателем).
- Многосвязный список — список, связующая часть элементов которого в общем случае содержит произвольное количество указателей. В этом виде списка каждый элемент входит в такое количество односвязных списков, сколько он имеет в себе полей связи.
В общем случае для связанных списков определены следующие операции:
- создание связного списка;
- включение элемента в связный список, в том числе и после (перед) определенным элементом;
- доступ к определенному элементу связного списка (поиск в списке);
- исключение элемента из связного списка;
- упорядочение (перестройка) связного списка;
- очистка связного списка;
- проверка объема связного списка (числа элементов в связном списке);
- объединение нескольких списков в один;
- разбиение одного списка на несколько;
- копирование списка;
- удаление связного списка.
Связные списки очень важны для представления различных сетевых структур, в частности деревьев, что и будет рассмотрено нами чуть ниже. Пока же рассмотрим работу с некоторыми из обозначенных нами типов связных списков на практических примерах.