Курс_Информатика_л12.ppt
- Количество слайдов: 12
Лекция 12 Списочные структуры 21 ноября 2014 г. Бабалова И. Ф. 1
2
Создание линейного односвязного списка Type PList=^Pl; Pl = record date: Integer; next: PList; End; var lb, lk, lp, ls: PList; lp Lb –начало списка ……………. lb: =nil; lk: =nil; пустой список. If lb=nil then begin new(lp); lp^. date: =Random(200); lp^. next: =nil; lb: =lp; lk: =lp; end else begin new(ls); * ls^. date: =random(200); (1) ls^. next: =nil; (2) lp^. next: =ls; (3 ) Ls * 125 20 nil Lk – конец списка nil Lp : =ls; Lk: =lp; End; …. . Прочтение списка: lp : =lb; Установили начало While lp<> nil do begin writeln (lp^. date); lp : =lp^. next; end; 3
Алгоритм создания списка Create_list New (ls) Lb: =nil; Lk: =nil Ввод x true Ls^. date: =x false Lb=nil Ls^. next: =nil New (lp) Lp^. next: =ls Lp^. date: =x Конец списка Lp : =ls; lk: =lp Lp^. next: =nil Lb: =lp; lk: =lp true Это начало списка Вывод списка false Есть числа? End_list 4
Удаление элемента в списке pl Удаление первого элемента a next b next c Перемещение начала списка nil Удаляемый элемент pl lp: =pl; a b While (lp<> nil) and (lp^. date<>b) do begin If lp=nil then ls: =lp; label 1. Caption: ='Список lp: =lp^. next; пуст' end; else //Это только движение по списку if (lp=pl)and (lp^. x=b) then if lp<> nil then begin pl: =pl^. next; ls^. next: =lp^. next; dispose(lp); end; // Удаление найденного значения end else 5 Удаление 1 -ого элемента ls^. next: =nil;
Алгоритм удаления элемента из списка Del_list Ввод z Lp: =lb false true Lp<>nil and lp^. date<>z Ls : =Lp; false Lp : =Lp^. next; true Lp<>nil Ls^. next: =lp^. next Ls^. next : =nil; Dispose (lp) Движение true Lp=nil Список пуст Вывод списка End_Del_list 6
Пример окна решения задачи об удалении любого элемента списка 7
Добавление элементов в созданный ранее список A next New(ls); B Задан упорядоченный C D список. Вставить элемент на правильное место. next nil Вставка должна быть Место в списке выполнена перед Алгоритм вставки найденным элементом. While lp<> nil do if lp^. x <newelem then lp: =lp^. next else // while assigned (lp) do Пока список имеет адрес элемента, не равный Begin nil new(ls); ls^: =lp^; //Новому элементу списка присваиваем // значения выбранного элемента списка lp^. x: = newelem; lp^. next: =ls; //Это вставляемое значение end; 8
Работа со стеками Дисциплина обработки данных: Добавление и удаление элементов стека выполняются только через его вершину Новая вершина стека Новый данные next данные nil Top While not eof(f) do Type Pstack= ^Pst; begin Pst = record date : Integer; new(Ps); next : Pstack; Read(f, x); end; Ps^. date: =x; Var Top, Ps: Pstack; Ps^. next: =Top; x: integer; Top: =Ps; …………………. end; end Стек и список можно создавать с помощью рекурсивных функций Для вставки элемента на правильное место в стек будет работать алгоритм, рассмотренный для линейных списков 9
Рекурсивное создание стека function Cr_st(k: integer): Pst; var x: integer; Это прочтение стека: pt: pst; ps: =tops; begin while ps<>nil do if k=0 then begin pt: =nil List. Box 2. Items. add(inttostr(ps^. date)); ps: =ps^. next; else end; begin read(f, x); Доп_лекция_11. doc new(pt); Фрагмент программы pt^. date: =x; для вызова рекурсивной pt^. next: =Cr_st(k-1); функции end; reset(f); Cr_st: =pt; tops: =Cr_st(n); end; 10 closefile(f);
Двусвязные и кольцевые списки Данные nil Данные pred next Добавление элементов в начало списка Данные FIFO nil Удаление элементов Только с конца списка кольцевой список Объявление типа: Type PQueue = ^ Queue; Queue= record x : integer; Это обычный односвязный список, но pred: PQueue ; последний элемент списка всегда ссылается next : PQueue; на начало списка. end; Есть кольцевые двусвязные списки, n - связные списки, деревья, сетевые структуры. Структура списка определяется количеством полей ссылок на структуру данных того же типа. 11
Двусвязный список Очередь Ol, Qe Qp Qp, Qe nil next pred next Qe pred nil Begin Var Ql, Qe, Qp: PQueue; new(Qp); begin Qp^. x: =newelem; Ql: =nil; Qp^. next: =nil; If Ql=nil then Qp^. pred: =Oe; begin Qe: =Qp; new(Qp); end; Qp^. x: =newelem; По окончании метода создания Qp^. next: =nil; очереди у нас есть два адреса: Qp^. pred: =nil; Ql , Qe - начала и конца очереди Ql: =Qp; Qe: =Qp; Движение по очереди: end else // только один While Qe<> nil do Qe: =Qe^. pred; 12 элемент в списке
Курс_Информатика_л12.ppt