Язык C_семинар 10_(10.05).ppt
- Количество слайдов: 10
Динамические структуры данных Примером динамической структуры данных является связанный список. Техника работы с ним предполагает в случае ввода новой записи запрашивать дополнительный объем памяти, а при удалении записи - освобождать соответствующий участок памяти. Для организации динамических структур данных используются функции - malloc() - выделить память, - free() - освободить память, прототипы которых находятся в файле
Пример. Ввести текст в динамическую память. Конец ввода – Ctrl+Z. Вводимые строки размещаются в динамической памяти, а их адреса запоминаются в массиве указателей text. В конце массива указателей заносится NULL для последующего определения количества строк. Мама бабушка папа я NULL
#include
Вызов функции: vvod(text 1); Параметр text 1 определен следующим образом: char *text 1[100]; // т. е. массив указателей на строки Пример. Освободить память, занятую введенным текстом. void freetext(char *text[]) // или void freetext(char **text) { while(*text!=NULL) free(*text++); }
Пример. Сформировать стек, содержащий структуры книга: Информация о книгах читается из текстового файла. Описание книги в файле занимает три строки: - в первой строке расположены фамилия, имя и отчество автора, разделенные пробелами, - во второй строке – название, - в третьей – год издания - в четвертой – цена. Книга Автор Фамилия Название Имя Год Отчество Цена
#include
/*У функции stackknig на входе filename - имя текстового файла (указатель на строку, содержащую имя файла). На выходе значение, возвращаемое функцией - указатель на вершину стека. */ book *push. Book (char *filename) { FILE *f; char *n; book *uk, *stack=NULL; if ((f=fopen(filename, "r"))==NULL) { printf("no such file"); exit(1); } while(!(feof(f)) ) { uk=(book*)malloc(sizeof(book)); /* выделение памяти для текущей книги */ uk->next=stack; stack=uk; fscanf(f, "%s", uk->author. fam); fscanf(f, "%s", uk->authtor. im); fscanf(f, "%s", uk->authtor. ot); while(getc(f)!='n'); fgets(uk->title, 81, f); for(n=uk->title; *n!=' '; n++) // удаление символа 'n' if (*n=='n') *n=' '; fscanf(f, "%d", &uk->year); fscanf(f, "%d", &uk->price); } fclose(f); return(stack); }
Задача 1. Сформировать циклический связанный список (стек), содержащий последовательность целых положительных чисел, вводимых с клавиатуры. Исходные данные: 1 2 3 0. Используем указатели: lst - вершина стека, first – первый элемент, curr(current) – текущий. 0 x 03 lst 0 x 03 3 0 x 02 lst 0 x 01 0 x 03 curr lst 0 x 02 curr 0 x 02 2 0 x 01 ---1 0 x 03 NULL 0 x 02 curr 0 x 01 first 0 x 01 n=2 0 3 1 Возвращаем указатель first – адрес первого введенного элемента.
#include
/* вывод циклического списка на экран */ void print_sp(node *lst) { node *p; //указатель на текущую запись int main() { int x 1=5; p=lst; if (lst) { do { p=p->next; printf("%7 d", p->info); } while(p!=lst); printf("n"); } else puts("empty"); } node *lst=make(); puts("list"); print_sp(lst); return 0; }