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

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

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

structor производит пустой список, устанавливая курсор в ПУСТОЙ УКАЗАТЕЛЬ. Проход печи для сжигания отходов производства - atively удаляет узлы, пока список не пуст. Мы эксплуатируем факт, что членская функция удаляет (данный ниже), удаляет узел, который она удаляет.

CircleList:: CircleList () //конструктор

: курсор (ПУСТОЙ УКАЗАТЕЛЬ)

CircleList:: ˜CircleList () //печь для сжигания отходов производства

в то время как (! пустой ()), удаляют ();

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

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

bool CircleList:: пустой () константа

возвращают курсор == ПУСТОЙ УКАЗАТЕЛЬ;

константа Elem& CircleList:: назад () константа

возвращают курсор-> элемент;

константа Elem& CircleList:: фронт () константа

возвращают курсор-> затем-> элемент;

недействительный CircleList:: прогресс ()

курсор = курсор-> затем;

//действительно ли список пуст?

//элемент в курсоре

//элемент после курсора

//предварительный курсор

Кодовый Фрагмент 3.31: Простые членские функции.

Затем, давайте рассмотрим вставку. Вспомните, что вставки к циркулярному связанному списку происходят после курсора. Мы начинаем, создавая новый узел и инициализируя его участника данных. Если список пуст, мы создаем новый узел, который указывает на себя. Мы тогда направляем курсор, чтобы указать на этот элемент. Иначе, мы связываем новый узел сразу после курсора. Кодекс представлен в Кодовом Фрагменте 3.32.

недействительный CircleList:: добавьте (константа Elem& e)

CNode* v = новый CNode;

v-> элемент = e;

если (курсор == ПУСТОЙ УКАЗАТЕЛЬ)

v-> затем = v;

курсор = v;

еще

v-> затем = курсор-> затем; курсор-> затем = v;



//добавьте после того, как курсор//создаст новый узел

//список пуст?//v указывает на себя//, курсор указывает на v

//список непуст?//связываются в v после курсора

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

132

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

Наконец, мы рассматриваем удаление. Мы предполагаем, что пользователь проверил, что список непуст прежде, чем призвать эту функцию. (Более тщательное внедрение бросило бы исключение, если список пуст.) Есть два случая. Если это - последний узел списка (который может быть проверен, проверив, что узел, который будет удален пункты к себе), мы устанавливаем курсор в ПУСТОЙ УКАЗАТЕЛЬ. Иначе, мы связываем следующий указатель курсора, чтобы перескочить через удаленный узел. Мы тогда удаляем узел. Кодекс представлен в Кодовом Фрагменте 3.33.

недействительный CircleList:: удалите ()

CNode* старый = курсор-> затем;

если (старый == курсор)

курсор = ПУСТОЙ УКАЗАТЕЛЬ;

еще

//

// // //

удалите узел после курсора

узел, удаляемый, удаляя единственный узел? список теперь пуст

курсор-> затем = старый-> затем; //связывают старый узел

удалите старый; //удаляют старый узел

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

Чтобы сохранять кодекс простым, мы опустили проверку на ошибки. Впереди, назад, и прогресс, мы должны сначала проверить, пуст ли список, так как иначе указатель курсора будет ПУСТЫМ. В первых двух случаях мы должны бросить своего рода excep-tion. В случае прогресса, если список пуст, мы можем просто возвратиться.

Поддержание плей-листа для цифрового аудиоплеера

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

Чтобы сделать это более конкретным, предположите, что у Вас есть друг, который любит ретро музыку, и Вы хотите создать плей-лист песен с прошлой Эры Дискотеки. Главная программа представлена Кодовый Фрагмент 3.34. Мы объявляем, что плей-лист объекта CircleList. Конструктор создает пустой плей-лист. Мы продолжаем добавлять три песни, «Живая Сидячая забастовка», «Le Freak», и «Джайв Талкин». Комментарии к праву показывают текущее содержание списка в квадратных скобках. Первый вход списка немедленно - элемент после курсора (который является, где вставка и удаление происходят), и последний вход в списке - курсор (который обозначен со звездочкой).