![Page 1: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/1.jpg)
АБСТРАКТНЫЕ ТИПЫ ДАННЫХПОСЛЕДОВАТЕЛЬНОСТИ, СПИСКИ
Максименкова Ольга Вениаминовна
Младший научный сотрудник МНУЛ ИССА
Старший преподаватель Департамента программной инженерии Факультета компьютерных наук
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 1
![Page 2: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/2.jpg)
Цели
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 2
Познакомиться
• С контейнерами и последовательностями, как с
абстрактными типами данных;
• С динамическими структурами данных;
• Со способами реализации этих представлений на языке
C++
Получить навыки
• Реализации некоторых АТД на языке C++
![Page 3: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/3.jpg)
Соглашения о терминологии
• Абстрактный Тип Данных (АТД) [abstract logic design] –
функциональное описание некоторого класса сущностей в
терминах операций, которые могут выполняться над ними.
• Интерфейс АТД – формальное и однозначное описание синтаксиса
и семантики операций, которые могут выполняться над
экземплярами АТД.
ТАК ЖЕ, КАК ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ НЕ
ОПРЕДЕЛЯЕТ ОСОБЕННОСТИ ЕГО РЕАЛИЗАЦИИ, ТАК И
ИНТЕРФЕЙС АТД НЕ ОПРЕДЕЛЯЕТ РЕАЛИЗАЦИЮ АТД.
![Page 4: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/4.jpg)
Контейнер
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 4
• Контейнер [container] – Абстрактный тип данных, представляющий
собой структурированную коллекцию информационных элементов,
доступ к которым определяется структурой контейнера.
• Добавление и удаление элементов контейнера назовём его
трансформацией.
• Доступ к элементу контейнера – операция получения или
изменения значения этого элемента.
• Последовательность [sequence] – контейнер, в котором элементы
упорядочены по индексам (пронумерованы).
![Page 5: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/5.jpg)
Некоторые виды последовательностей
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 5
• Вектор [vector]
• последовательность, в которой возможен доступ к любому элементу по индексу элемента
• Дек
• Стек
• Очередь
![Page 6: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/6.jpg)
Дек
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 6
• Дек [deque, double ended queue] – последовательность, в
которой возможны только:
1. доступ: к концевым элементам;
2. добавление: до начального и после конечного элемента;
3. удаление: концевых элементов.
Удаление Добавление
Добавление Удаление
Deque
![Page 7: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/7.jpg)
Очередь
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 7
• Очередь [queue] – дек, в котором возможны только:
1. доступ: к начальному элементу;
2. добавление: после конечного элемента;
3. удаление: начального элемента.
• Конечный элемент очереди часто называют хвостом очереди,
а начальный – головой очереди.
Добавление Удаление
Queue
![Page 8: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/8.jpg)
Стек
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 8
• Стек [stack] – дек, в котором возможны только:
1. доступ: к конечному элементу;
2. добавление: после конечного элемента;
3. удаление: конечного элемента.
• Конечный элемент стека называют вершиной стека.
Удаление
Добавление
Stack
![Page 9: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/9.jpg)
СпискиОдносвязный
Двусвязный
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 9
![Page 10: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/10.jpg)
Список
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 10
• Список представляет собой такую реализацию последовательности однотипных элементов, когда элементы связаны друг с другом посредством ссылок.
• Каждый элемент списка содержит не только информационное поле, но одно или более полей со ссылками на другие элементы.
![Page 11: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/11.jpg)
Наиболее распространённые списки
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 11
• односвязные списки• каждый элемент, кроме последнего, содержит ссылку на
следующий, последний элемент ссылается на null
• двухсвязные списки• каждый элемент, кроме первого и последнего, содержит ссылки на
предыдущий и следующий
![Page 12: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/12.jpg)
Односвязный список
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 12
Value Value Value null ...
Начало списка [Top]
5 7 10 null ...
foo bar baz null ...
Примеры
![Page 13: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/13.jpg)
Модель элемента односвязного списка
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 13
Value Value Value null ...
Начало списка [Top]
#include "iostream"using namespace std;struct ListItem {int n;ListItem* next;
};
void main() {ListItem head; // создаём структуруhead.n = 1; // значение поля структурыhead.next = NULL; // значение поля типа указатель
}
![Page 14: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/14.jpg)
Как добавить элемент в односвязный список?
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 14
// добавим элементListItem newItem;newItem.n = 2;newItem.next = NULL;// head должен "указывать" на новый элементhead.next = &newItem;
// пройдём по списку, нужен "указатель"ListItem* curr = &head;while (curr != NULL) {cout << curr->n << endl;curr = curr->next;
}system("pause");
Самостоятельно напишем функцию, добавления элемента в конец
односвязного списка следующий слайд
![Page 15: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/15.jpg)
Задание
1. Описать функцию добавления нового элемента в конецодносвязного списка (как узнать, в какой список добавить элемент?).
2. Описать функцию вывода на экран всех элементов списка, начиная с головы.
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 15
![Page 16: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/16.jpg)
Вставка элемента в односвязный список
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 16
Пусть имеется некоторый односвязный список и ссылка р на элемент,
после которого мы хотим вставить новый элемент.
Value Value ...
n n+1
...
Предшествующий
элемент
Состояние списка перед добавление элемента
1. создание нового элемента
2. присвоение значений его полям
3. добавление связи с элементом, следующим за P
4. добавление связи с элементом P
Алгоритм добавления элемента
![Page 17: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/17.jpg)
Создание и инициализация нового элемента
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 17
?
Новый элемент [Tmp]
?
New
Новый элемент [Tmp]
?
1. Создание нового элемента
2. Присвоение значений его полям
ListItem Tmp;
Tmp.n = 2;Tmp.next = NULL;
![Page 18: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/18.jpg)
Добавление связей
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 18
Максименкова О.В., 2015 18
Value Value ...
n n+1
...
New
Новый элемент [Tmp]
Предшествующий
элемент [P]
Value Value ...
n n+1
...
New
Новый элемент [Tmp]
Предшествующий
элемент [P]
3. добавление связи с элементом, следующим за P
4. добавление связи с элементом P
Tmp.next = p.next;
p.next = &Tmp;
![Page 19: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/19.jpg)
Удаление элемента из односвязного списка
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 19
Пусть имеется некоторый односвязный список и ссылка р на
элемент, предшествующий тому, который мы хотим удалить.
Состояние списка перед удалением элемента
1. добавление связи между P и следующим за удаляемым элементом
2. Освобождение памяти из под удалённого элемента!!!
Алгоритм удаления элемента
Value Value
n n+1
...
Предшествующий
элемент [P]
Value ...
n+2
![Page 20: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/20.jpg)
Задание
1. Описать функцию добавления элемента в произвольное место в списке (как задавать это место?)
2. Описать функцию удаления элемента из списка.
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 20
![Page 21: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/21.jpg)
Двусвязный список
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 21
Value Valuenull Value ... null
Начало списка [Head] Конец списка [Tail]
5 7null 9 ... null
![Page 22: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/22.jpg)
Модель элемента двусвязного списка
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 22
Value Valuenull Value ... null
Начало списка [Head] Конец списка [Tail]
struct DblListItem {int n;ListItem* next;ListItem* prev;
};
void main() {DblListItem head;head.n = 1;head.next = NULL;head.prev = NULL;
}
![Page 23: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/23.jpg)
Задание
1. Опишите набор функций для управления двусвязным списком: добавление элемента списка, удаление элемента списка, добавление элемента в конец списка, добавление элемента в начало списка; вывод списка в прямом и обратном порядке.
2. Каким образом реализовать закольцованный список?
3. * Опишите функции для управления односвязным и двусвязным закольцованным списком.
4. ** Реализуйте любой алгоритм сортировки для списка.
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 23
![Page 24: Абстрактные типы данных, последовательности, списки](https://reader030.vdocuments.net/reader030/viewer/2022021419/58a3eabb1a28ab272e8b54df/html5/thumbnails/24.jpg)
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ, 20.06.2016 24
Спасибо за внимание!
Максименкова Ольга Вениаминовна
Старший преподаватель Департамента программной инженерии, ФКН
E-mail: [email protected]
Blog: Stop To Scale (http://stoptoscale.blogspot.ru)