Лекция 4_Списки.ppt
- Количество слайдов: 63
Динамические структуры данных. Линейные списки.
► Абстрактный тип данных – это тип данных (набор значений и совокупность операций для этих значений), доступ к которому осуществляется только через интерфейс. *. h *. cpp
► this – указатель на текущий объект, для которого он вызывается. ► static ► существует только одна копия этой переменной (относящаяся к структуре), а не множество копий (относящихся к отдельным объектам).
► Контейнер – это структура данных, главной задачей которой является хранение других объектов, причем способ их хранения четко определен. ► Примером контейнера может служить массив, структура, встроенная в язык. ► Списки представляют собой пример контейнерных классов.
► Динамические структуры по определению характеризуются отсутствием физической смежности элементов структуры в памяти непостоянством и непредсказуемостью размера (числа элементов) структуры в процессе ее обработки. ► Для установления связи между элементами динамической структуры используются указатели, через которые устанавливаются явные связи между элементами.
Элемент динамический ► информационного поля или поля данных, (вектор, массив, запись и т. п. ); ► поля связок (содержатся один или несколько указателей, связывающий данный элемент с другими элементами структуры);
Достоинства связного представления данных ► размер структуры ограничивается только доступным объемом машинной памяти; ► при изменении логической последовательности элементов структуры требуется не перемещение данных в памяти, а только коррекция указателей.
Недостатки ► работа с указателями требует, более высокой квалификации от программиста; ► на поля связок расходуется дополнительная память; ► доступ к элементам связной структуры может быть менее эффективным по времени
Линейные списки
►тип динамической структуры данных (список, дерево, граф) зависит от функций, которые работают с этой структурой.
динамика ► переменные структур создаются как динамические (количество их может быть произвольным); ► количество связей между переменными и их характер также определяются динамически в процессе работы программы. ЗАГОЛОВОК
Список ► Список представляет собой линейную последовательность элементов, каждая из которых содержит указатели на аналогичные элементы (соседи). ► Самосылочные структуры
Виды списков -односвязные; ► -двусвязный циклический список цепочка представляет собой кольцо. ►
Заголовок 0 1 2 3 Логический номер NULL Текущий Односвязный список
Заголовок Текущий
основное свойство списков ► последовательность обхода списка зависит не от физического размещения элементов списка в памяти, а от последовательности из связывания указателями. ЛОГИЧЕСКИЙ НОМЕР элемента в списке
массив доступ произвольный физическое перемещение (массив указателей) список доступ последовательный переброска указателей
Работа с односвязным списками
p->next. . . // указатель на следующий элемент p = p->next; // переход к следующему элементу p !=NULL. . . // проверка на конец списка NULL
p->next ==NULL. . . // проверка на последний элемент for (p=p. Head; p !=NULL; p=p->next). . . // просмотр элементов списка NULL if (p. Head !=NULL) { for (p=p. Head; p->next !=NULL; p=p->next)……. ; } // поиск последнего элемента
List *pred; // просмотр с сохранением // указателя на предыдущий элемент for (pred=NULL, p=p. Head; p !=NULL; pred=p, p=p->next). . . // указатель на второй элемент от текущего NULL
p. Head->next = pnew; p. Head = pnew; // включение в начало непустого списка pnew->next = NULL; p->next = pnew; // включение в конец непустого списка NULL pnew
pred->next = p->next; // исключение текущего элемента // списка (если он не первый) NULL pnew->next = p->next; p->next = pnew; // включение после текущего элемента NULL
Способы формирования списков ► Вариант 1. Элементы -обычные переменные, связи инициализируются транслятором
► Вариант 2. Элементы списка создаются в обычном массиве. Связи устанавливаются динамически.
► Вариант 3. Элементы списка являются динамическими переменными, связи между ними устанавливаются программно
-заголовок -“фиктивный” элемент без данных; -можно использовать не заголовок, а указатель на заголовок. list**
Двусвязные списки
Конструктор (constructor) представляет собой функцию, которая описывается внутри структуры и имеет такое же имя. Конструкторы автоматически вызываются при создании экземпляра структуры
O(1)
Графическая интерпретация присваивания указателя q->pred->next = p; q p next pred словесное описание - указателю на следующий элемент списка в предыдущем от текущего присвоить указатель на новый
Адресная интерпретация присваивания указателя. q->pred->next = p; 40 30 q p next pred 40 10 30 40
Удаление элемента из 2 -связного списка e e->Next->Prev = e->Prev->Next = e->Next;
Null
Θ(n)
Перестановка соседних элементов 2 -связного списка
Получить последний
общие разрешения на операции со списком enum Permit { ALL = 0, NOINSERT =1, NODELETE =2, NOUPDATE =3 }; // all permit // lock INSERT // lock DELETE // NOUPDATE
Object: : Perm = NOUPDATE; Object: : Perm = ALL; bool is. Lock. Insert() {return (Perm == NOINSERT || Perm == NOUPDATE); }; bool is. Lock. Delete() {return (Perm == NODELETE || Perm == NOUPDATE); }
Проблема концов списка и циклические списки ► -список ► ► пустой; -элемент единственный; -элемент в начале списка; -элемент в конце списка; -элемент в середине списка.
Представление списков массивами ► 1) aa ► 2) 2 ► 3) -1 cd 3 2 ad 1 0 sf 4 1 qq -1 3
Применение линейных списков ► непредсказуемы требования на размер памяти и большое число включений и исключений ► представление очереди, стека с помощью линейного списка
Мультисписки
Достоинства ► экономия памяти (при множестве списков информационная часть существует в единственном экземпляре) ► целостность данных
Нелинейные разветвленные списки Нелинейным разветвленным списком является список, элементами которого могут быть тоже списки (a, (b, c, d), e, (f, g)) () ((a))
последовательность атомов и списков (подсписков),
► Порядок. (e…. d) ► Глубина - максимальный уровень, приписываемый элементам внутри списка или внутри любого подсписка в списке (2) ► Длина - это число элементов уровня 1 в списке (3)
Выражение: (a+b)*(c-(d/e))+f будет вычисляться в следующем порядке: a+b d/e c-(d/e) (a+b)*(c-d/e)+f (((a, +, b), *, (c, -, (d, /, e)), +, f)
Представление очереди и стека односвязным списком ►?
? list *F 2(list *ph, int v) { struct list *q; q = new list; q->val = v; q->next = ph; ph = q; return ph; }
? list *F 3(list *p, int n) { for (; n!=0 && p!=NULL; n--, p=p->next); return p; }
? void F 5() { int n; if (fst==lst) return; n = (lst-1) %100; FIFO[lst]=FIFO[n]; lst = ++lst % 100; }
Лекция 4_Списки.ppt