Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 15_Динамические структуры данных

.pdf
Скачиваний:
33
Добавлен:
14.03.2016
Размер:
246.85 Кб
Скачать

Стандартные контейнеры

Во многих языках программирования имеются готовые динамические структуры данных различного назначения. Их принято называть контейнерами

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

31

Стандартные контейнеры

Контейнеры являются подлинно динамическими структурами данных, т.к.:

в статическом массиве языка Си размер должен быть известен при компиляции;

в динамическом массиве — во время выполнения программы в момент создания массива;

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

элементов.

32

Операции над элементами контейнеров

Операции над элементами контейнеров производятся через библиотечные функции

Типичные операции над элементами контейнера включают:

добавление данных в контейнер

получение информации о кол-ве элементов в контейнере

обращение к данным, хранящимся в контейнере

извлечение/удаление данных из контейнера

33

Пример набора операций над контейнером "список студентов"

// Студент

 

struct TStudent

 

{

 

char FIO[51];

// ФИО

float avg_rating;

// средний рейтинг

};

 

// Добавить студента в группу

int addStudent(const char *group, struct TStudent *student);

//Вернуть кол-во студентов в группе int getCount(const char *group);

//Получить студента в группе

struct TStudent *getStudent(const char *group, int student);

// Извлечь студента из группы

34 struct TStudent *removeStudent(const char *group, int student);

Добавление данных в контейнер (хранящий адреса)

Программист динамически выделяет память и записывает в нее необходимые данные

В контейнер передается адрес выделенной памяти - фактически в контейнере хранятся только указатели

35

Добавление данных в контейнер (хранящий адреса)

IVT-160

Иванов

 

IVT-160

76.9

 

 

 

 

 

Петров

 

 

...

92.7

addStudent(...)

...

 

 

Сидоров

 

 

 

25.0

 

 

newStudent

Козлов

 

66.6

36

Задание

Добавить в группу IVT-160 студента Козлова, (средний рейтинг = 66.6) предварительно выделив для него память и заполнив необходимой информацией. Для добавления использовать функцию addStudent()

struct TStudent

 

{

 

char FIO[51];

// ФИО

float avg_rating;

// средний рейтинг

};

 

//Добавить студента в группу

//param [in] group – название группы

//param [in] student – указатель на добавляемого студента

//return - индекс добавленного студента; если студент

//не добавлен, то возвращается -1

37 int addStudent(const char *group, struct TStudent *student);

Добавление данных в контейнер по ссылке

//Выделяем память под запись о новом студенте struct TStudent *newStudent =

(struct TStudent *) malloc(sizeof(struct TStudent));

//Заполняем запись о студенте

strcpy(newStudent->FIO, "Козлов"); newStudent->avg_rating = 66.6;

// Добавляем студента в группу addStudent("IVT-160", newStudent);

38

Обращение к данным, хранящимся в контейнере

В контейнер передается индекс искомого элемента

Контейнер возвращает адрес хранимого элемента

По полученному адресу можно читать или изменять содержимое элемента

39

Обращение к данным, хранящимся в контейнере

IVT-160

Иванов

 

76.9

getStudent(...)

 

 

Петров

Petrov

 

 

...

92.7

 

 

 

 

Сидоров

 

 

25.0

 

40