Лекции по проге / 15_Динамические структуры данных
.pdf
Организация ссылочных структур
●Контейнеры хранят только ссылки на элементы
●Память под элементы выделяется и освобождается вне контейнера
●Если элемент хранится в нескольких контейнерах, то все контейнеры содержат указатели на один и тот же элемент
51
Организация ссылочных структур
IVT-160 |
Иванов |
GRANTS |
|
76.9 |
|||
|
|
||
|
Петров |
|
|
... |
92.7 |
... |
|
|
|||
|
Сидоров |
|
|
|
25.0 |
|
|
IVT-161 |
Антонов |
|
|
|
|
||
... |
77.2 |
|
|
Щукина |
|
||
|
|
||
52 |
86.5 |
|
|
|
|
Задание
Для групп IVT-160 и IVT-161 составить список GRANTS студентов, получающих стипендию.
Стипендию получают студенты, средний рейтинг которых равен или превышает 76 баллов
53
Организация ссылочных структур
struct TStudent *student; |
// |
текущий студент |
int studentCount; |
// |
кол-во студентов в группе |
const char groups[][15] = {"IVT-160", "IVT-161"}; // группы
int |
i; |
// |
индекс |
группы |
int |
j; |
// |
индекс |
студента в группе |
for(i = 0; i < 2; i++)
{// Составляем список стипендиатов для группы studentCount = getCount( groups[i] );
for(j = 0; j < studentCount; j++)
{
student = getStudent( groups[i], j ); if( student->avg_rating >= 76 )
{ addStudent( "GRANTS", student ); }
}
54 }
Задание
Уничтожьте списки студентов IVT-160, IVT-161 и
GRANTS, освободив память
55
Организация ссылочных структур
const char groups[][15] = {"IVT-160", "IVT-161"}; // группы
//Уничтожаем список стипендиатов while( getCount( "GRANTS" ) > 0 ) { removeStudent( "GRANTS" ); }
//Уничтожаем группы студентов вместе со студентами for(int i = 0; i < 2; i++)
{
//Уничтожаем группу студентов
while( getCount( groups[i] ) > 0 )
{ free ( removeStudent( groups[i], 0 ) ); }
56 }
Это надо помнить!
Выделенную память обязательно следует освобождать. Автоматически она не освобождается
Количество вызовов и передаваемые адреса для функции free должны строго соответствовать количеству вызовов и адресам для функций malloc
и calloc
Обращение к невыделенной или уже освобожденной памяти вызовет ошибку (см. памятку по указателям)
57
Это надо помнить!
Если массив (контейнер) хранит значения объектов, то он хранит их копии. Изменение одной копии не оказывает влияния на другие. Копии возникают и уничтожаются вместе с массивом (контейнером)
Если массив (контейнер) хранит указатели на объекты, то он хранит только ссылки на них. Изменение объекта заметно по всем ссылкам на него. Память под объекты выделяется и освобождается отдельно от массива (контейнера)
58
