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

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

(a)

(b)

(c)

Рисунок 3.14: Удаление узла, хранящего PVD: (a) перед удалением; (b) соединение старого узла; (c) после удаления узла.

3.3.3 C ++ внедрение

Давайте рассмотрим, как осуществить вдвойне связанный список в C ++. Во-первых, мы представляем C ++ класс для узла списка в Кодовом Фрагменте 3.22. Чтобы сохранять кодекс простым, мы приняли решение не получить templated класс, как мы сделали в Разделе 3.2.1 для отдельно связанных списков. Вместо этого мы предоставляем typedef заявление, которое определяет тип элемента, названный Элементом. Мы определяем его, чтобы быть последовательностью, но любой другой тип мог использоваться вместо этого. Каждый узел хранит элемент. Это также содержит указатели и на предыдущие и на следующие узлы списка. Мы объявляем, что DLinkedList друг, таким образом, он может получить доступ к членам парламента, не занимающим официального поста узла.

typedef натягивают Элемент; //перечисляют тип элемента

класс DNode //вдвойне связанный узел списка

частный:

E l их el их;

//

стоимость элемента узла

DNode* предыдущий;

//

предыдущий узел в списке

DNode* затем;

//

следующий узел в списке

друг класс DLinkedList;

//

позвольте доступ DLinkedList

;

Кодовый Фрагмент 3.22: C ++ внедрение вдвойне связанного узла списка.

Затем, мы представляем определение вдвойне связанного класса списка, DLinkedList, в Кодовом Фрагменте 3.23. В дополнение к конструктору и печи для сжигания отходов производства, общественные участники состоят из функции, которая указывает, пуст ли список в настоящее время

126

Глава 3. Множества, Связанные Списки и Рекурсия (подразумевать, что у этого нет узлов кроме стражей), и accessors, чтобы восстановить элементы передней и задней части. Мы также обеспечиваем методы для вставки и удаления элементов от передней и задней части списка. Есть два частных участника данных, заголовок и трейлер, которые указывают стражам. Наконец, мы обеспечиваем две защищенных сервисных членских функции, добавляем и удаляем. Они используются внутренне классом и его подклассами, но они не могут быть призваны снаружи класса.

класс DLinkedList

общественность:

//вдвойне связанный список

DLinkedList (); ˜DLinkedList (); пустой bool () константа; константа Elem& фронт () константа; константа Elem& назад () константа; пустота addFront (константа Elem& e); пустота addBack (константа Elem& e); пустота removeFront (); пустота removeBack ();

частный:

DNode* заголовок; DNode* трейлер;

// // // // // // // // // // //

печь для сжигания отходов производства конструктора - пустой список? получите передний элемент g и спину, которую el ement добавляет к фронту списка, добавляют к задней части списка, удаляют из фронта, удаляют из спины, местные определения типа перечисляют стражей

защищенный: //местные утилиты

пустота добавляет (DNode* v, константа Elem& e); //вставляют новый узел, прежде чем v пустота удалят (DNode* v); //удаляют узел v

;

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

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

DLinkedList:: DLinkedList ()

заголовок = новый DNode;

трейлер = новый DNode;

заголовок-> затем = трейлер;

трейлер-> предыдущий = заголовок;

//конструктор//создает стражей

//сделайте, чтобы они указали друг другу

DLinkedList:: ˜DLinkedList ()

в то время как (! пустой ()) removeFront ();

удалите заголовок; удалите трейлер;

//печь для сжигания отходов производства//удаляет все, но стражи//удаляют стражей

Кодовый Фрагмент 3.24: конструктор Класса и печь для сжигания отходов производства.