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

6.2. Списки

245

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

Затем, давайте посмотрим, как различные функции класса NodeList осуществлены. В Кодовом Фрагменте 6.10, мы начинаем, представляя много простых функций, включая конструктора, размер и пустые функции, и функции конца и начинание. Конструктор создает первоначально пустой список, устанавливая n к нолю, затем ассигнуя заголовок и узлы трейлера и соединяя их. Функция быть - джин возвращает положение первого узла списка, который является узлом только после стража заголовка, и конец функции возвращает положение трейлера. Как de - произведенный на свет, это - положение после последнего элемента списка. В обоих случаях мы призываем частного конструктора, объявленного в пределах класса Iterator. Нам разрешают сделать так, потому что NodeList - друг Iterator.

NodeList:: NodeList ()

n = 0;

заголовок = новый Узел; трейлер = новый Узел;

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

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

международный NodeList:: размер () константа

возвращают n;bool NodeList:: пустой () константа

возвращаются (n == 0);

NodeList:: Iterator NodeList:: начните () константу

возвращают Iterator (заголовок-> затем);NodeList:: Iterator NodeList:: конец () константа

возвращают Iterator (трейлер);

//конструктор

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

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

//размер списка

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

//начните положение - первый пункт

//положение конца только вне в последний раз

Кодовый Фрагмент 6.10: Внедрения многих простых членских функций класса NodeList.

Давайте затем посмотрим, как осуществить вставку. Есть три различных общественных функции вставки, вставка, insertFront, и insertBack, которые показывают в Кодовом Фрагменте 6.11. Вставка функции (p, e) выполняет вставку во вдвойне связанный список, используя тот же самый подход, что нам объяснили в Разделе 3.3. В частности позвольте w быть указателем на узел p, позволить u быть указателем на предшественника p. Мы создаем новый узел v и связываем его прежде w и после u. Наконец, мы увеличиваем n, чтобы указать, что есть один дополнительный элемент в списке.

246 Глава 6. Список и Iterator adTs

// вставьте e прежде p недействительный NodeList:: вставка (константа NodeList::Iterator& p, константа Elem& e)

Узел* w = p.v;

Узел* u = w-> предыдущий;

Узел* v = новый Узел;

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

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

n + +;

// // //

// //

предшественник p's узла p новый узел, чтобы вставить

связь в v прежде w связывается в v после u

недействительный NodeList:: insertFront (константа Elem& e)//вставляют на фронте

вставка (начинаются (), e);

недействительный NodeList:: insertBack (константа Elem& e) //вставляют с задней стороны

вставка (конец (), e);

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

Функция insertFront призывает вставку в начале списка, и функция insertBack призывает вставку на трейлер списка.

Наконец, в Кодовом Фрагменте 6.12 мы представляем внедрение стереть функции, которая удаляет узел из списка. Снова, наш подход следует непосредственно от метода, описанного в Разделе 3.3 для удаления узла из вдвойне связанного списка. Позвольте v быть указателем на узел, который будет удален и позволен w быть его преемником и u быть его предшественником. Мы расцепляем v, связываясь u и w друг другу. Как только v был расцеплен из списка, мы должны возвратить его ассигнованное хранение к системе, чтобы избежать любых утечек памяти. Наконец, мы декремент ряд элементов в списке.

недействительный NodeList:: сотрите (константа Iterator& p)

Узел* v = p.v;

Узел* w = v-> затем;

Узел* u = v-> предыдущий;

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

удалите v;

n-;

//

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

удалите p

узел, чтобы удалить предшественника преемника unl я nk p удаляет этот узел один меньше элемента

недействительный NodeList:: eraseFront () //удаляют сначала

стирают (начните ());недействительный NodeList:: eraseBack () //удаляют в последний раз

стирают (-конец ());

Кодовый Фрагмент 6.12: Внедрения функции стирают класса NodeList.