Скачать презентацию Динамические структуры данных Примером динамической структуры данных является Скачать презентацию Динамические структуры данных Примером динамической структуры данных является

Язык C_семинар 10_(10.05).ppt

  • Количество слайдов: 10

Динамические структуры данных Примером динамической структуры данных является связанный список. Техника работы с ним Динамические структуры данных Примером динамической структуры данных является связанный список. Техника работы с ним предполагает в случае ввода новой записи запрашивать дополнительный объем памяти, а при удалении записи - освобождать соответствующий участок памяти. Для организации динамических структур данных используются функции - malloc() - выделить память, - free() - освободить память, прототипы которых находятся в файле . При программировании задач подобного типа широко применяются указатели и массивы указателей.

Пример. Ввести текст в динамическую память. Конец ввода – Ctrl+Z. Вводимые строки размещаются в Пример. Ввести текст в динамическую память. Конец ввода – Ctrl+Z. Вводимые строки размещаются в динамической памяти, а их адреса запоминаются в массиве указателей text. В конце массива указателей заносится NULL для последующего определения количества строк. Мама бабушка папа я NULL

#include <stdio. h> #include <malloc. h> #include <string. h> void vvod(char *text[]) { char #include #include #include void vvod(char *text[]) { char buf[81]; // буфер для ввода строки while(gets(buf)!=NULL) { // выделение памяти для cтроки и запоминание ее адреса *text=(char*)malloc(strlen(buf)+1); // копирование содержимого буфера в динамическую память strcpy(*text++, buf); } *text=NULL; }

Вызов функции: vvod(text 1); Параметр text 1 определен следующим образом: char *text 1[100]; // Вызов функции: vvod(text 1); Параметр text 1 определен следующим образом: char *text 1[100]; // т. е. массив указателей на строки Пример. Освободить память, занятую введенным текстом. void freetext(char *text[]) // или void freetext(char **text) { while(*text!=NULL) free(*text++); }

Пример. Сформировать стек, содержащий структуры книга: Информация о книгах читается из текстового файла. Описание Пример. Сформировать стек, содержащий структуры книга: Информация о книгах читается из текстового файла. Описание книги в файле занимает три строки: - в первой строке расположены фамилия, имя и отчество автора, разделенные пробелами, - во второй строке – название, - в третьей – год издания - в четвертой – цена. Книга Автор Фамилия Название Имя Год Отчество Цена

#include <malloc. h> #include <stdio. h> #include <stdlib. h> //структурный тип struct book { #include #include #include //структурный тип struct book { struct { char fam[15], im[15], ot[15]; } author; char title[81]; int year, price; book *next; //поле указателя }; book *push. Book (char *filename); /*прототип функции формирования списка*/ int main() { book *catalog ; char filename[20]; printf("input file name: "); gets(filename); catalog=push. Book(filename); return 0; }

/*У функции stackknig на входе filename - имя текстового файла (указатель на строку, содержащую /*У функции 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. Сформировать циклический связанный список (стек), содержащий последовательность целых положительных чисел, вводимых с клавиатуры. Исходные данные: 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 <stdio. h> #include <malloc. h> /* структурный тип для односвязного списка */ struct #include #include /* структурный тип для односвязного списка */ struct node { int info; node *next; }; node *make (void) { node *lst=NULL, *curr, *first; int n; puts("Input positive integers"); /* пока удается считать число, и оно положительное */ while(scanf("%d", &n)==1 && n>0) { curr=(node*)malloc(sizeof(node)); /* если список еще пуст */ if (!lst) first=curr; curr->next=lst; curr->info=n; lst=curr; } first->next=lst; return(first); /* вернем адрес последней записи */ }

/* вывод циклического списка на экран */ void print_sp(node *lst) { node *p; //указатель /* вывод циклического списка на экран */ 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; }