c++ Базовый. Занятие 07

12
Модуль 2 : Составные типы данных и работа с динамической памятью. Темы лекции : Динамические структуры данных. Практическое задание : Динамические структуры данных. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 7

Upload: igor-shkulipa

Post on 21-Mar-2017

57 views

Category:

Education


0 download

TRANSCRIPT

Page 1: C++ Базовый. Занятие 07

Модуль 2: Составные типы данных и работа с динамической памятью.

Темы лекции: Динамические структуры данных.

Практическое задание: Динамические структуры данных.

Тренер: Игорь Шкулипа, к.т.н.

C++ Базовый. Занятие 7

Page 2: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 2

Динамические структуры данных

К динамическим структурам данных относятся:

⚫ однонаправленные (односвязные) списки;

⚫ двунаправленные (двусвязные) списки;

⚫ циклические списки;

⚫ стек;

⚫ очередь;

⚫ бинарные деревья (и не только бинарные);

⚫ представления графов.

Page 3: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 3

Список

Список – это совокупность элементов, образующих последовательнуюструктуру. Разделяют следующие виды списков:

⚫ односвязные списки

⚫ двусвязные списки

⚫ циклические списки

Односвязный список:

Связь элементов в этом списке однонаправленная. Каждый предыдущийэлемент указывает на следующий. Последний элемент указывает наnull

Информация

первый элемент

Указатель на

следующий

Информация

Указатель на

следующий

Информация

Указатель на

следующий

второй элемент последний элемент

...

Page 4: C++ Базовый. Занятие 07

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

Page 5: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 5

Двусвязный список

Двусвязный список:

Связь элементов в этом списке двунаправленная. Каждый предыдущийэлемент указывает на следующий, каждый следующий - напредыдущий. Следующий элемент для последнего - это null,предыдущий элемент для первого – это null.

Информация

первый элемент

Указатель на

следующий

Информация

Указатель на

следующий

Информация

Указатель на

следующий

второй элемент последний элемент

...

Указатель на

предыдущий

Указатель на

предыдущий

Указатель на

предыдущий

Page 6: C++ Базовый. Занятие 07

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

Page 7: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 7

Циклические списки

Информация

первый элемент

Указатель на

следующий

Информация

Указатель на

следующий

Информация

Указатель на

следующий

второй элемент последний элемент

...

Указатель на

предыдущий

Указатель на

предыдущий

Указатель на

предыдущий

Информация

первый элемент

Указатель на

следующий

Информация

Указатель на

следующий

Информация

Указатель на

следующий

второй элемент последний элемент

...

Циклические списки отличаются от обычных тем, что крайние элементыуказывают не на null, а с начала на конец и с конца на начало.

Односвязный циклический список:

Двусвязный циклический список:

Page 8: C++ Базовый. Занятие 07

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

Page 9: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 9

Очередь

Очередь — это структура, вкоторой для добавленияэлементов доступен только одинконец, называемый хвостом, адля удаления — другой,называемый головой.

Принцип организации данных встеке – это, так называемыйFIFO (First-in-First-out).

Для очереди определяются двеоперации:

⚫ добавить данные в очередь

⚫ извлечь данные из очереди

8

16

1

10

12

добавить

12

10

извлечь

Page 10: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 10

Дерево

Дерево — это совокупностьэлементов, называемых узлами,один из которых определен каккорень, и отношений,образующих иерархическуюструктуру узлов. Узлы, которыене имеют ни одногопоследующего узла, называютсялистьями.

В двоичном (бинарном) деревекаждый узел может быть связанне более чем двумя другимиузлами.

Рекурсивно двоичное деревоопределяется так: двоичноедерево бывает либо пустым,либо содержит корневой узел, атакже два независимыхподдерева — левое поддеревои правое поддерево.

8

16 1

10

12

12

10

Page 11: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 11

Граф

Графы можно представить несколькими способами:

1. В виде матрицы смежностей (двумерный массив).

1. В виде структуры, состоящей из массива вершин и массива ребер. Гдеребра представляются в виде структуры, содержащей номер вершины«из которой» ребро и номер вершины «в которую» ребро.

1. В виде динамической структуры данных, в которой содержится номервершины и два массива указателей на следующие вершины.

struct GraphNode

{

int iNumber;

GraphNode* NextNodes[];

GraphNode* PrevNodes[];

}

Page 12: C++ Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 12

Лабораторная работа №7

1. Создать динамический односвязный список.

⚫ Отсортировать список в порядке возрастания/убывания

⚫ Вставить в список введенный с клавиатуры элемент, не нарушая порядка сортировки.

2. Создать динамический двусвязный список.

⚫ Отсортировать список в порядке возрастания/убывания.

⚫ Вставить в список введенный с клавиатуры элемент, не нарушая порядка сортировки.

3. Создать динамический двусвязный циклический список.

⚫ Найти максимальный элемент списка.

⚫ Найти минимальный элемент списка

4. Создать стек.

5. Создать очередь.

6. Создать бинарное дерево.