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

3.4. Циркулярные связанные списки и аннулирование списка

3.4 Циркулярные связанные списки и аннулирование списка

В этой секции мы изучаем некоторые заявления и расширения связанных списков.

3.4.1 Циркулярные связанные списки

129

У циркулярного связанного списка есть тот же самый вид узлов как отдельно связанный список. Таким образом, у каждого узла в циркулярном связанном списке есть следующий указатель и стоимость элемента. Но, вместо того, чтобы иметь голову или хвост, узлы циркулярного связанного списка связаны в цикл. Если мы пересекаем узлы циркулярного связанного списка от какого-либо узла следующими следующими указателями, мы в конечном счете посещаем все узлы и цикл назад к узлу, с которого мы начали.

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

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

(фронт) (назад) курсор

СЛАБЫЙ MSP ATL BOS

Рисунок 3.15: циркулярный связанный список. Узел, на который ссылается курсор, называют спиной и узлом, немедленно следующее называют фронтом.

Мы определяем следующие функции для циркулярного связанного списка:

фронт (): Возвратите элемент, на который ссылается курсор; ошибка пере -

sults, если список пуст.

назад (): Возвратите элемент немедленно после курсора; ошибка

результаты, если список пуст.

прогресс (): Продвиньте курсор к следующему узлу в списке.

130

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

добавьте (e): Вставьте новый узел с элементом e немедленно после

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

удалите (): Удалите узел немедленно после курсора (не

сам курсор, если это не единственный узел); если список - прибывает пустой, курсор собирается аннулировать.

В Кодовом Фрагменте 3.28, мы показываем C ++, внедрение узла cir-cularly связало список, предположив, что каждый узел содержит единственную последовательность. Структура узла чрезвычайно идентична тому из отдельно связанного списка (вспомните Кодовый Frag-ment 3.13). Чтобы сохранять кодекс простым, мы не осуществили templated класс. Вместо этого мы предоставляем typedef заявление, которое определяет Элемент типа элемента, чтобы быть основным типом списка, который в этом случае является последовательностью.

typedef натягивают Элемент; класс CNode

частный:

E l их el их; CNode* затем;

друг класс CircleList;

;

//тип элемента

//циркулярный связанный узел списка

//связанный элемент списка оценивает//следующий пункт в списке

//обеспечьте доступ CircleList

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

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

класс CircleList

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

//циркулярный связанный список

CircleList (); ˜CircleList (); пустой bool () константа; константа Elem& фронт () константа; константа Elem& назад () константа; недействительный прогресс (); пустота добавляет (константа Elem& e); пустота удаляет ();

частный:

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

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

CNode* курсор; //курсор

;

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