Лекции по проге / 15_Динамические структуры данных
.pdf
Стандартные контейнеры
Во многих языках программирования имеются готовые динамические структуры данных различного назначения. Их принято называть контейнерами
Работа с контейнерами проще и удобнее, чем с обычными массивами, если необходимо добавлять и удалять элементы в процессе выполнения программы
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
