Содержание
- 2. Динамические структуры данных Динамическая структура данных – структура данных создаваемая в процессе выполнения программы и размещаемая
- 3. Динамическая структура данных список Список – линейная динамическая структура данных, как правило, одного типа, произвольного доступа
- 4. Виды списков Виды списков определяются исходя из метода хранения: Последовательные списки; Связанные списки; Гибридные (смешанные) списки.
- 5. Последовательные списки Основные переменные используемые для работы с последовательным списком: Указатель на начало списка; Текущий размер
- 6. Переменные и типы для работы с последовательным списком Типы данных: typedef struct{ TYPE *list; int count;
- 7. Добавление элемента в конец списка int Add(LIST *ls, TYPE val) { TYPE *tmp = (TYPE*)realloc(ls->list,(ls->count+1)*sizeof(TYPE)); if(!tmp)
- 8. Вставка элемента на определенную позицию в списке int Ins(LIST *ls,TYPE val, int ind) { if(ind if(ls->count
- 9. Удаление элемента из списка int Del(LIST *ls, int ind) { if((ind =ls->count)) return 0; for(int i=ind;i
- 10. Графическое изображение операция добавления, вставки и удаления элемента
- 11. Изменение и получение элемента из списка int Set(LIST *ls, TYPE val, int ind) { if((ind =ls->count))
- 12. Удаление всего списка, определение его размера, инициализация void Destroy(LIST *ls) { if(ls->list) free(ls->list); ls->list = NULL;
- 13. Пример использования Пользователь с клавиатуры вводит целые числа. Признак завершения – ввод пустой строки. Вывести на
- 14. Пример использования typedef int TYPE; int cmpInc(const void *p1,const void *p2) { return *((int*)p1) - *((int*)p2);
- 15. Пример использования printf("\nЧетные значения: "); for(int i=0,n=Count(&list2);i int val; Get(&list2,&val,i); printf("%d ",val); } printf("\nНечетные значения: ");
- 16. Модификация int InsInc(LIST *lst, TYPE val) { for(int i=0,n=Count(lst);i int tmp; Get(lst,&tmp,i); if(tmp>=val) return Ins(lst,val,i); }
- 17. Модификация (цикл ввода) while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); if(val%2==0) InsInc(&list2,val); else
- 18. Преимущества и недостатки списков с последовательным хранением Преимущества: Быстрый доступ к элементам списка посредством индексации. Недостатки:
- 19. Списки со связанным хранением Виды списков со связанным хранением: Однонаправленные списки; Двунаправленные списки.
- 20. Графическое изображение
- 21. Типы данных и переменные для работы со связанными списками Необходимо иметь элемент списка, который бы агрегировал
- 22. Пример для двунаправленного списка Переменные и типы: typedef struct _Element{ TYPE val; struct _Element *next, *prev;
- 23. Перемещение по списку int MoveHead(LIST *ls) { ls->curr = ls->head; if(ls->head == NULL) return 0; return
- 24. Добавление элемента в конец списка int Add(LIST *ls, TYPE val) { Element *tmp = (Element *)malloc(sizeof(Element));
- 25. Добавление элемента перед текущим элементом в списке int Ins(LIST *ls, TYPE val) { if(!ls->curr) return Add(ls,val);
- 26. Вставка элемента
- 27. Удаление текущего элемента int Del(LIST *ls) { if(ls->curr==NULL) return 0; Element *tmp=ls->curr->prev; if(!tmp){ ls->head=ls->head->next; ls->head->prev=NULL; }else{
- 28. Удаление элемента
- 29. Запись и получение значения элемента int Set(LIST *ls, TYPE val) { if(ls->curr == NULL) return 0;
- 30. Удаление и инициализация списка void Init(LIST *ls) { ls->head = ls->curr = NULL; } void Destroy(LIST
- 31. Пример использования void SortInc(LIST *ls) { if((ls->head == NULL)|| (ls->head->next == NULL)) return; int flag =
- 32. Пример использования int main(int argc, char *argv[]) { LIST list1 = {NULL,NULL}, list2 = {NULL,NULL}; while(1){
- 33. Пример использования printf("\nЧетные значения: "); if(MoveHead(&list2)) do{ int val; Get(&list2,&val); printf("%d ",val); }while(MoveNext(&list2)); printf("\nНечетные значения: ");
- 34. Модификация int InsInc(LIST *ls, TYPE val) { if(MoveHead(ls)) do{ int tmp; Get(ls,&tmp); if(tmp>=val) return Ins(ls,val); }while(MoveNext(ls));
- 35. Модификация (цикл ввода) while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); if(val%2==0) InsInc(&list2,val); else
- 36. Преимущества и недостатки списков со связанным хранением Преимущество: Эффективные функции работы с памятью при добавлении или
- 37. Смешанный список
- 38. Переменные и типы данных typedef struct{ TYPE **list; //Указатель на начало списка int count; //Количество элементов
- 39. Инициализация и уничтожение списка void Init(LIST *ls) { ls->list = NULL; ls->count = 0; } void
- 40. Добавление элемента в конец списка int Add(LIST *ls, TYPE val) { TYPE *new = (TYPE*)malloc(sizeof(TYPE)); if(!new)
- 41. Вставка элемента в середину списка int Ins(LIST *ls, TYPE val, int ind) { if(ind if(ind >=
- 42. Удаление элемента из списка int Del(LIST *ls, int ind) { if((ind =ls->count)) return 0; free(ls->list[ind]); for(int
- 43. Запись и получение значения из списка int Set(LIST *ls, TYPE val, int ind) { if((ind =ls->count))
- 44. Пример использования int CmpInc(const void *p1, const void *p2) { return **((int**)p1) - **((int**)p2); } int
- 45. Пример использования int main(int argc, char *argv[]) { LIST list1 = {NULL,0}, list2 = {NULL,0}; while(1){
- 46. Пример использования printf("\nЧетные значения: "); for(int i=0,n=Count(&list2);i int val; Get(&list2,&val,i); printf("%d ",val); } printf("\nНечетные значения: ");
- 47. Модификация int InsInc(LIST *lst, TYPE val) { for(int i=0,n=Count(lst);i int tmp; Get(lst,&tmp,i); if(tmp>=val) return Ins(lst,val,i); }
- 48. Модификация (цикл ввода) while(1){ char str[20]; gets(str); if(str[0]==0) break; int val = atoi(str); if(val%2==0) InsInc(&list2,val); else
- 49. Смешанный список Преимущество: Быстрый доступ к элементам списка посредством индексации Недостаток: Усложненность операций выделения и освобождения
- 51. Скачать презентацию