Списки.ppt
- Количество слайдов: 12
Динамические структуры данных (язык Паскаль) Списки
2 Динамические структуры данных Строение: набор узлов (элементов), объединенных с помощью ссылок. Как устроен узел: ссылки на другие узлы данные Типы структур: списки деревья односвязный графы nil двунаправленный (двусвязный) nil nil циклические списки (кольца) nil nil nil
3 Списки: новые типы данных Что такое список: 1) пустая структура – это список; 2) список – это начальный узел (голова) и связанный с ним список. ! Рекурсивное определение! nil Новые типы данных: Type U = ^Zveno; ; { указатель на узел } Zveno = Record { структура узла } Inf : Longint; Next: U; { ссылка на следующий } End; Адрес начала списка: var First: U; . . . First : = nil; ! Для доступа к списку достаточно знать адрес его головы!
4 Типовые операции над списками: Рассмотрим работу со связанными списками на примере однонаправленного некольцевого списка. 1. Добавление звена в начало списка; 2. Удаление звена из начала списка; 3. Добавление звена в произвольное место списка, отличное от начала (например, после звена, указатель на которое задан); 4. Удаление звена из произвольного места списка, отличного от начала (например, после звена, указатель на которое задан); 5. Проверка, пуст ли список; 6. Очистка списка; 7. Печать списка.
5 Добавление узла в начало списка 1) Установить ссылку нового узла на голову списка: Vsp nil Vsp^. next : = First; First nil 2) Установить новый узел как голову списка: Vsp First : = Vsp; First Procedure V_Nachalo(Var First : U; X : Longint); ; Var Vsp : U; Begin New(Vsp); Vsp^. Inf : = X; Vsp^. Next : = First; First : = Vsp; End; nil
6 Добавление узла после заданного 1) Установить ссылку нового узла на узел, следующий за Pred: Vsp nil Vsp^. Next : = Pred^. Next; Pred nil 2) Установить ссылку узла Pred на новый узел: Vsp Pred^. next = Vsp; nil Procedure V_Spisok(Pred : U; X : Longint); Var Vsp : U; Begin New(Vsp); Vsp^. Inf : = X; Vsp^. Next : = Pred^. Next; Pred^. Next : = Vsp; End;
7 Удаление звена из начала списка Vsp First nil p Procedure Iz_Nachala(Var First : U; Var X : Longint); Var Vsp : U; Begin Vsp : = First; First : = First^. Next; X : = Vsp^. Inf; Dispose(Vsp); End;
Удаление звена из произвольного места списка Проблема: нужно знать адрес предыдущего узла Pred First nil Vsp Procedure Iz_Spiska(Pred : U; Var X : Longint); Var Vsp : U; Begin Vsp : = Pred^. Next; Pred^. Next : = Pred^. Next; X : = Vsp^. Inf; Dispose(Vsp); End; 8
9 Вывод списка Задача: Вывести на экран каждый элемент списка. Vsp First nil Алгоритм: 1) установить вспомогательный указатель Vsp на голову списка; 2) если указатель Vsp равен nil (дошли до конца списка), то стоп; 3) Вывод информационного поля звена с адресом Vsp ; 4) перейти к следующему узлу, Vsp^. next. Procedure Print(First : U); Var Vsp : U; Begin Vsp : = First; // начали с головы While Vsp <> Nil Do // пока не дошли до конца Begin Write(Vsp^. Inf : 6); // Вывод информационного поля Vsp : = Vsp^. Next // переходим к следующему End; Write. Ln End;
10 Вывод списка Задача: Вывести на экран каждый элемент списка. Vsp First nil Алгоритм: 1) установить вспомогательный указатель Vsp на голову списка; 2) если указатель Vsp равен nil (дошли до конца списка), то стоп; 3) Вывод информационного поля звена с адресом Vsp ; 4) перейти к следующему узлу, Vsp^. next. Procedure Print; Var Vsp : U; Begin Vsp : = First; // начали с головы While Vsp <> Nil Do // пока не дошли до конца Begin Write(Vsp^. Inf : 6); // Вывод информационного поля Vsp : = Vsp^. Next // переходим к следующему End; Write. Ln End;
11 Очистка списка Procedure Ochistka (Var First: U); Var Vsp : BT; Begin While Not Pust(First) Do Iz_Nachala(First, Vsp) End;
12 Проверка, пуст ли список; Function Pust(First : U) : Boolean; Begin Pust : = First = Nil End;


