Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

3.3. Вдвойне связанные списки 127

Затем, в Кодовом Фрагменте 3.25 мы показываем основной класс accessors. Определить

пуст ли список, мы проверяем, что нет никакого узла между этими двумя стражами. Мы делаем это, проверяя, следует ли трейлер немедленно после заголовка. Чтобы получить доступ к переднему элементу списка, мы возвращаем элемент, связанный с узлом, который следует за заголовком списка. Чтобы получить доступ к заднему элементу, мы возвращаем элемент, связанный с узлом, который предшествует трейлеру. Обе операции предполагают, что список непуст. Мы, возможно, увеличили эти функции, бросив исключение, если попытка предпринята, чтобы получить доступ к фронту или задней части пустого списка, как мы сделали в Кодовом Фрагменте 3.6.

bool DLinkedList:: пустой () константа //пустой список?

возвращаются (заголовок-> затем == трейлер);константа Elem& DLinkedList:: фронт () константа //получают передний элемент

возвращают заголовок-> затем-> элемент;константа Elem& DLinkedList:: назад () константа //g и спина el ement

возвращают трейлер-> предыдущий-> элемент;

Кодовый Фрагмент 3.25: Accessor функционирует для вдвойне связанного класса списка.

В Разделе 3.3.1 мы обсудили, как вставить узел во вдвойне связанный список. Местная сервисная функция добавляет, который показывают в Кодовом Фрагменте 3.26, осуществляет эту операцию. Чтобы добавить узел к фронту списка, мы создаем новый узел и немедленно вставляем его после заголовка, или эквивалентно, немедленно перед узлом, который следует за заголовком. Чтобы добавить новый узел к задней части списка, мы создаем новый узел и немедленно вставляем его перед трейлером.

// вставьте новый узел прежде v

недействительный DLinkedList:: добавьте (DNode* v, константа Elem& e)

DNode* u = новый DNode; u-> элемент = e;// создайте новый узел для e

u-> затем = v; // свяжите u промежуточный v u-> предыдущий = v-> предыдущий; // .. .and v-> предыдущий v-> предыдущий-> затем = v-> предыдущий = u;

недействительный DLinkedList:: addFront (константа Elem& e)//добавляют к фронту списка

добавляют (заголовок-> затем, e);

недействительный DLinkedList:: addBack (константа Elem& e)//добавляют к задней части списка

добавляют (трейлер, e);

Кодовый Фрагмент 3.26: Вставка нового узла во вдвойне связанный список. Защищенный

сервисная функция добавляет, вставляет узел z перед произвольным узлом v. Общественный участник функционирует addFront и addBack, оба призывают эту сервисную функцию.

128

Глава 3. Множества, связанные списки и рекурсия

Заметьте, что вышеупомянутый кодекс работает, даже если список пуст (подразумевать, что единственные узлы - заголовок и трейлер). Например, если addBack призван на пустой список, то ценность трейлера-> предыдущий является указателем на заголовок списка. Таким образом узел добавлен между заголовком и трейлером, как желаемый. Одно из главных преимуществ обеспечения сторожевых узлов должно избежать обращаться особых случаев, которые иначе были бы необходимы.

Наконец, давайте обсудим удаление. В Разделе 3.3.2 мы показали, как удалить произвольный узел из вдвойне связанного списка. В Кодовом Фрагменте 3.27, мы представляем местную сервисную функцию, удаляют, который выполняет операцию. В дополнение к соединению узла, это также удаляет узел. Общественный участник функционирует, removeFront и removeBack осуществлены, удалив узлы немедленно после заголовка и немедленно предшествуя трейлеру, соответственно.

недействительный DLinkedList:: удалите (DNode* v)

DNode* u = v-> предыдущий; DNode* w = v-> затем; u-> затем = w;

w-> предыдущий = u;

удалите v;

// // // //

удалите узел v, преемник предшественника расцепляют v из списка

недействительный DLinkedList:: removeFront () //удаляют из шрифта

удаляют (заголовок-> затем);недействительный DLinkedList:: removeBack () //удаляют из спины

удаляют (трейлер-> предыдущий);

Кодовый Фрагмент 3.27: Удаление узла из вдвойне связанного списка. Местная полезность

функция удаляет, удаляет узел v. Общественный участник функционирует, removeFront и removeBack призывают эту сервисную функцию.

Есть еще много опций, которые мы, возможно, добавили к нашему простому imple-процессу мышления вдвойне связанного списка. Хотя мы обеспечили доступ к концам списка, мы не обеспечили механизма для доступа или изменения элементов посреди списка. Позже, в Главе 6, мы обсуждаем понятие iterators, который обеспечивает механизм для доступа к произвольным элементам списка.

Мы также не выполнили проверки на ошибки в нашем внедрении. Это - обязанность пользователя не попытаться получить доступ или удалить элементы из пустого списка. В более прочном внедрении вдвойне связанного списка мы проектировали бы членский фронт функций, назад, removeFront, и removeBack, чтобы бросить excep-tion, когда попытка предпринята, чтобы выполнить одну из этих функций в пустом списке. Тем не менее, это простое внедрение иллюстрирует, как легкий это должно управлять этой полезной структурой данных.