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

6.2. Списки 241

insertBack (e): Вставьте новый элемент e в L как последний элемент.

вставка (p, e): Вставьте новый элемент e в L перед положением p в L. eraseFront (): Удалите первый элемент L. eraseBack (): Удалите последний элемент L.

сотрите (p): Удалите из L элемент в положении p; лишает законной силы p

как положение.

Функции insertFront (e) и insertBack (e) обеспечены как удобство, так как они эквивалентны вставке (L.begin (), e) и вставке (L.end (), e), соответственно. Точно так же eraseFront и eraseBack могут быть выполнены более общим func-tion, стирают.

Состояние ошибки происходит, если недействительное положение передано как аргумент одной из операций по списку. Причины положения p, чтобы быть недействительными включают:

p никогда не инициализировался или был установлен в положение в различном списке

p был ранее удален из списка

p следует из незаконной операции, такой как попытка выступить ++ p,

где p = L.end (), то есть, пытаясь получить доступ к положению вне конца

положение

Мы не проверяем на эти ошибки в нашем внедрении. Вместо этого это пере - sponsibility программиста, чтобы быть уверенным, что только юридические статусы используются. Пример 6.3: Мы показываем ряд операций для первоначально пустого списка L ниже. Мы используем переменные p и q, чтобы обозначить различные положения, и мы показываем объект, в настоящее время хранившийся в таком положении в круглых скобках в колонке Продукции.

Операция

Продукция

L

insertFront (8)

-

(8)

p = начните ()

p: (8)

(8)

insertBack (5)

-

(8, 5)

q = p; ++ q

q: (5)

(8, 5)

p = = начните ()

верный

(8, 5)

вставка (q, 3)

-

(8, 3, 5)

*q = 7

-

(8, 3, 7)

insertFront (9)

-

(9, 8, 3, 7)

eraseBack ()

-

(9, 8, 3)

сотрите (p)

-

(9, 3)

eraseFront ()

-

(3)

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

242

Глава 6. Список и Iterator ADTs быть осуществленным, используя функции списка ADT, с положениями, являющимися de - termined естественным заказом исков. Аналогично, простой редактор текста включает понятие позиционной вставки и удаления, так как такие редакторы, как правило, выполняют все обновления относительно курсора, который представляет настоящее положение в списке знаков отредактированного текста.

6.2.3 Вдвойне связанное внедрение списка

Есть много различных способов осуществить наш список ADT в C ++. Вероятно,

самый естественный и эффективный путь состоит в том, чтобы использовать вдвойне связанный список, подобный тому, который мы ввели в Разделе 3.3. Вспомните, что наша вдвойне связанная структура списка основана на двух сторожевых узлах, названных заголовком и трейлером. Они созданы, когда список сначала построен. Другие элементы списка вставлены между этими стражами.

После нашей обычной практики, чтобы сохранять кодекс простым, мы жертвуем генералом - erality, воздерживаясь от использования шаблонов класса. Вместо этого мы обеспечиваем Элемент определения типа, который является основным типом элемента списка. Мы оставляем детали производства полностью универсального templated класса как упражнение (R-6.11).

Прежде, чем определить класс, который мы называем NodeList, мы определяем две важных структуры. Первое представляет узел списка, и другой представляет iterator для списка. Оба из этих объектов определены как вложенные классы в NodeList. Начиная с пользователей узлов доступа класса исключительно через iterators, узел - de - clared член парламента, не занимающий официального поста NodeList, и iterator - общественный участник.

Объект узла называют Узлом и представляют в Кодовом Фрагменте 6.6. Это - простой C ++ структура, у которой есть только (общественные) участники данных, состоя из элемента узла, связи с предыдущим узлом списка и связи со следующим узлом списка. Так как это, как объявляют, частное к NodeList, его участники доступны только в NodeList.

Узел struct

//

узел списка

E l их el их;

//

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

Узел* предыдущий;

//

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

Узел* затем;

//

затем в списке

;

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

Наш объект iterator называют Iterator. Пользователям класса NodeList это может быть ac-cessed компетентным, вводят имя NodeList:: Iterator. Его определение, которое является пред - sented в Кодовом Фрагменте 6.7, помещено в общественную часть NodeList. К элементу, связанному с iterator, можно получить доступ, перегрузив dereferencing oper-ator (» * «). Чтобы позволить сравнить объекты iterator, мы перегружаем