Урок 8 — Однонаправленный линейный список. Динамическое выделение памяти в Си
Однонаправленный линейный список - это список, который имеет указатель на начало списка, при этом каждый список имеет указатель на следующий список, а последний список принимает указатель NULL, что говорит о том, что он последний. Однонаправленный кольцевой список - это список, который имеет указатель на начало списка, при этом каждый список имеет указатель на следующий список, а последний список имеет указатель на начало списка. Динамическое выделение памятинеобходимо для того, чтобы память выделялась только тогда, когда нам надо, и при необходимости освобождалась. Динамическая память в сивыделяется функцией new. Освобождение памяти происходит оператором delete. По сути говоря, работа с динамической памятью связана с тем, чтобы выделять и очищать память корректно. Чтобы список был связанным, необходимо в самой структуре иметь указатель на следующий список. Для доступа к полям списка используется стрелка (->) Пример файловой системы (их атрибуты: имя, расширение, дата создания, размер, атрибуты). Список имеет следующий вид: struct FDat { //структура данных При выделении памяти для структуры необходимо делать проверку: это первое выделение или нет. Если это первое выделение, то указатель на начало списка принимает указатель на эту структуру. Пример кода: if (posl == NULL){ //если это первый список Пример задачи: Разработать программу, которая выполняет обработку данных об объектах файловой системы (их атрибуты: имя, расширение, дата создания, размер, атрибуты). Данные хранить в виде однонаправленного списка в динамически распределяемой памяти. Программа должна поддерживать диалоговый интерфейс с пользователем и обеспечивать следующие функции: РешениеДля решения данной задачи, необходимо использовать динамическую память. Разбить программу на функции (функции создания, удаления записи и т. д.). В данном алгоритме используются связанные списки. В них существует шесть полей с показателями, один из которых указывает на следующий элемент списка, а другие на данные которые содержат нужную информацию. При выделении памяти сначала выделяется память для записи, а затем для структуры данных. При удалении все происходит в обратном порядке, поскольку иначе не будет освобождаться объем задействованной памяти. Описание функцийФункция Add добавляет элемент списка, память в куче выделяется с помощью функции new. Функция Del удаляет выбранный элемент списка по его номеру (номер элемента на отображается на экране). Память освобождается функциейdelete. Функция Show выводит на экран созданный список. Функция Find находит искомый элемент (поиск возможен по части имени). Функция Freemem осуществляет очистку памяти занятой списком. В программе пользователю предоставляется выбор конкретных действий после выполнения этих действий осуществляется возвращение в главное меню. Выход из программы осуществляется при нажатии клавиши Esc, после этого осуществляется очистка памяти и проверка, освободилась ли вся память. Если нет, то выводится предупреждение. Текст программы1. Head.h #ifndef TEXT_H #include <iostream.h> struct FDat { //структура данных FDat *Add(FDat *, FDat *); #endif
2 PROGRAM.cpp #include "head.h" FDat *Add(FDat *posl) cout << "Vvedite - Name, Racsherenie, Daty, Razmer and Attribut: \n"; FDat *Del(FDat *begin, int &identif ) cout << "Mi udalaem!!! \n"; cout <<"Vvedite NAME : "; } void Show (FDat *begin) } void Find (FDat *begin) if (j == strlen(name)) { begin = begin->Next; void FreeRam (FDat *begin) //////////////////////////////////////////////////// int main () mem = farcoreleft(); // Размер своб. памяти cin>>ch; // {реализация меню} switch (ch) { cout <<"\n Memory - " <<farcoreleft()<<"\n"; FreeRam(Begin); // очистка памяти cout <<"\n Memory - " <<farcoreleft()<<"\n"; cout<<" Press key..."<<endl; return 0; Результат работы программы: |