Связный список - это разновидность линейных структур данных,
представляющая собой последовательность элементов, обычно
отсортированную в соответствии с заданным правилом. Последовательность
может содержать любое количество элементов, поскольку при создании
списка используется динамическое распределение памяти.
Каждый элемент связного списка представляет собой отдельный объект,
содержащий поле для хранения информации и указатель на следующий элемент
списка (а в случае двусвязного списка в объекте хранится также указатель
на предыдущий элемент).
Схема, изображающая связный и двусвязный списки из трех элементов:
Передвижение по списку осуществляется по указателям, которые указывают
на соседние элементы списка. При добавлении нового элемента к списку
необходимо динамически выделить под него память и присвоить
соответствующие значения указателям соседних элементов, а также
указателям самого созданного элемента.
Создание простого связного
списка
В качестве примера рассмотрим связный список, хранящий целые числа.
Элементы списка сортируются по возрастанию в зависимости от величины
числа, которое хранится в данном элементе.
Каждый элемент списка является экземпляром структуры, которая
описывается следующим образом:
Здесь pphead - это указатель
на указатель на голову списка (т.е. на его первый элемент), val - значение, которое необходимо
добавить в список. При добавлении нового элемента списка учитывается
величина числа, которое будет помещено в информационное поле
создаваемого элемента. Таким образом, упорядоченность элементов списка,
которые расположены по возрастанию, не нарушается, и список остается
отсортированным.
Вывести спискок на экран можно с помощью функции print():
Поскольку память для элементов списка выделяется динамически, после
окончания работы со списком необходимо явно удалить все его элементы.
Функция удаления элементов списка может быть реализована так:
Это определение отличается от определения элемента простого
односвязного списка только наличием указателя на предыдущий элемент
списка (pprev).
Определение класса стека будет выглядеть следующим образом:
template<class T> class Stack { TNode<T>* plast; long count; public: Stack(): plast(0), count(0) {} ~Stack(); void push(T val); T pop(); T top()const; long getCount()const {return count;} };
plast указывает на последний
элемент, помещенный в стек. count
- количество элементов в стеке.
Функция push() помещает новый
элемент в стек, функция pop()
извлекает элемент из стека, а функция top()
возвращает значение верхнего элемента, не извлекая его.