Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы 9-44.docx
Скачиваний:
4
Добавлен:
22.09.2019
Размер:
252.07 Кб
Скачать

27. Взаимодействие между массивами и указателями. Динамические массивы. Операции выделения и освобождения памяти.

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

Память, зарезервированная под динамический массив с помощью new[], должна освобождаться операцией delete[]. А для функции malloc – функцией free.

28. Тип данных «структура». Объявление, синтаксис и особенности использования.

struct [ имя_типа ] {

тип_1 элемент_1:

тип_2 элемент_2;

тип_n элемент_n;

} [ список_описателей ];

В отличие от массива структура может содержать элементы разных типов.

Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа той же структуры, но могут быть указателями на него.

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания.

Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование.

Доступ к полям структуры выполняется с помощью операции выбора (точка) при обращении к полю через имя структуры и -> при обращении через указатель.

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

29. Динамические типы данных. Список. Основные операции над элементами списка. Примеры.

Элемент любой динамической структуры данных представляет собой структуру (в смысле struct), содержаплую по крайней мере два поля: для хранения данных и для указателя. Полей данных и указателей может быть несколько. Поля данных могут быть любого типа: основного, составного или типа указатель. Описание простейшего элемента (компоненты, узла) выглядит следующим образом:

struct Node{

Data d; // тип данных Data должен быть определен ранее

Node *р;

};

Линейные списки

Самый простой способ связать множество элементов — сделать так, чтобы каждый элемент содержал ссылку на следующий. Такой список называется однонаправленным (односвязным). Если добавить в каждый элемент вторую ссылку — на предыдущий элемент, получится двунаправленный список (двусвязный), если последний элемент связать указателем с первым, получится кольцевой список.

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

Над списками можно выполнять следующие операции:

  • начальное формирование списка (создание первого элемента);

  • добавление элемента в конец списка;

  • чтение элемента с заданным ключом;

  • вставка элемента в заданное место списка (до или после элемента с заданным

  • ключом);

  • удаление элемента с заданным ключом;

  • упорядочивание списка по ключу.

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

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

Struct Node{

int d;

Node *next;

Node *prev;

};