1. Модуль 2: Составные типы данных и работа с динамической
памятью.
Темы лекции: Динамические структуры данных.
Практическое задание: Динамические структуры данных.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 7
2. http://www.slideshare.net/IgorShkulipa 2
Динамические структуры данных
К динамическим структурам данных относятся:
⚫ однонаправленные (односвязные) списки;
⚫ двунаправленные (двусвязные) списки;
⚫ циклические списки;
⚫ стек;
⚫ очередь;
⚫ бинарные деревья (и не только бинарные);
⚫ представления графов.
3. http://www.slideshare.net/IgorShkulipa 3
Список
Список – это совокупность элементов, образующих последовательную
структуру. Разделяют следующие виды списков:
⚫ односвязные списки
⚫ двусвязные списки
⚫ циклические списки
Односвязный список:
Связь элементов в этом списке однонаправленная. Каждый предыдущий
элемент указывает на следующий. Последний элемент указывает на
null
Информация
первый элемент
Указатель на
следующий
Информация
Указатель на
следующий
Информация
Указатель на
следующий
второй элемент последний элемент
...
4. http://www.slideshare.net/IgorShkulipa 4
Структура для односвязного списка
struct ListElement
{
int iInformation;
ListElement* Next;
}
...
//Создание следующего элемента списка
ListElement *elem1=new ListElement;
elem1->iInformation=1;
elem1->Next=null;
ListElement *elem2=new ListElement;
elem2->iInformation=2;
elem2->Next=null;
elem1->Next=elem2;
1
elem1
Next
2
elem2
Next
null
5. http://www.slideshare.net/IgorShkulipa 5
Двусвязный список
Двусвязный список:
Связь элементов в этом списке двунаправленная. Каждый предыдущий
элемент указывает на следующий, каждый следующий - на
предыдущий. Следующий элемент для последнего - это null,
предыдущий элемент для первого – это null.
Информация
первый элемент
Указатель на
следующий
Информация
Указатель на
следующий
Информация
Указатель на
следующий
второй элемент последний элемент
...
Указатель на
предыдущий
Указатель на
предыдущий
Указатель на
предыдущий
6. http://www.slideshare.net/IgorShkulipa 6
Структура для двусвязного списка
struct ListElement
{
int iInformation;
ListElement* Next;
ListElement* Prev;
}
...
//Создание следующего элемента списка
ListElement *elem1=new ListElement;
elem1->iInformation=1;
elem1->Next=null;
elem1->Prev=null;
ListElement *elem2=new ListElement;
elem2->iInformation=2;
elem2->Next=null;
elem2->Prev=elem1;
elem1->Next=elem2;
1
elem1
Next
2
elem2
Next
null
Prev
Prev
null
7. http://www.slideshare.net/IgorShkulipa 7
Циклические списки
Информация
первый элемент
Указатель на
следующий
Информация
Указатель на
следующий
Информация
Указатель на
следующий
второй элемент последний элемент
...
Указатель на
предыдущий
Указатель на
предыдущий
Указатель на
предыдущий
Информация
первый элемент
Указатель на
следующий
Информация
Указатель на
следующий
Информация
Указатель на
следующий
второй элемент последний элемент
...
Циклические списки отличаются от обычных тем, что крайние элементы
указывают не на null, а с начала на конец и с конца на начало.
Односвязный циклический список:
Двусвязный циклический список:
8. http://www.slideshare.net/IgorShkulipa 8
Стек
Стек — динамическая структура
данных, представляющая из
себя упорядоченный набор
элементов, в которой
добавление новых элементов и
удаление существующих
производится с одного конца,
называемого вершиной стека.
Принцип организации данных в
стеке – это, так называемый
LIFO (Last-in-First-out).
Для стека определяются всего две
операции:
⚫ push – добавить данные в
стек
⚫ pop – извлечь данные из
стека
8
16
1
10
12
push
8
16
1
10
12
pop
12
12
9. http://www.slideshare.net/IgorShkulipa 9
Очередь
Очередь — это структура, в
которой для добавления
элементов доступен только один
конец, называемый хвостом, а
для удаления — другой,
называемый головой.
Принцип организации данных в
стеке – это, так называемый
FIFO (First-in-First-out).
Для очереди определяются две
операции:
⚫ добавить данные в очередь
⚫ извлечь данные из очереди
8
16
1
10
12
добавить
12
10
извлечь
10. http://www.slideshare.net/IgorShkulipa 10
Дерево
Дерево — это совокупность
элементов, называемых узлами,
один из которых определен как
корень, и отношений,
образующих иерархическую
структуру узлов. Узлы, которые
не имеют ни одного
последующего узла, называются
листьями.
В двоичном (бинарном) дереве
каждый узел может быть связан
не более чем двумя другими
узлами.
Рекурсивно двоичное дерево
определяется так: двоичное
дерево бывает либо пустым,
либо содержит корневой узел, а
также два независимых
поддерева — левое поддерево
и правое поддерево.
8
16 1
10
12
12
10
11. http://www.slideshare.net/IgorShkulipa 11
Граф
Графы можно представить несколькими способами:
1. В виде матрицы смежностей (двумерный массив).
1. В виде структуры, состоящей из массива вершин и массива ребер. Где
ребра представляются в виде структуры, содержащей номер вершины
«из которой» ребро и номер вершины «в которую» ребро.
1. В виде динамической структуры данных, в которой содержится номер
вершины и два массива указателей на следующие вершины.
struct GraphNode
{
int iNumber;
GraphNode* NextNodes[];
GraphNode* PrevNodes[];
}
12. http://www.slideshare.net/IgorShkulipa 12
Лабораторная работа №7
1. Создать динамический односвязный список.
⚫ Отсортировать список в порядке возрастания/убывания
⚫ Вставить в список введенный с клавиатуры элемент, не нарушая порядка
сортировки.
2. Создать динамический двусвязный список.
⚫ Отсортировать список в порядке возрастания/убывания.
⚫ Вставить в список введенный с клавиатуры элемент, не нарушая порядка
сортировки.
3. Создать динамический двусвязный циклический список.
⚫ Найти максимальный элемент списка.
⚫ Найти минимальный элемент списка
4. Создать стек.
5. Создать очередь.
6. Создать бинарное дерево.