Скачать презентацию Структура данных и алгоритмы динамика Сформировать Скачать презентацию Структура данных и алгоритмы динамика Сформировать

Структура данных и алгоритмы.pptx

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

Структура данных и алгоритмы динамика Структура данных и алгоритмы динамика

 Сформировать однонаправленный список и однонаправленный список к заглавным звеном Написать процедуру добавления элементов Сформировать однонаправленный список и однонаправленный список к заглавным звеном Написать процедуру добавления элементов Написать процедуру просмотра элементов Написать процедуру поиска элементов Написать процедуру вставки элемента перед ключом Написать процедуру вставки элемента после ключа Написать процедуру удаления элемента по ключу

Однонаправленные списки Однонаправленные списки

операции начальное формирование списка (запись первой компоненты); добавление компоненты в конец списка; определение первого операции начальное формирование списка (запись первой компоненты); добавление компоненты в конец списка; определение первого элемента в линейном списке; чтение компоненты с заданным ключом; с заданным свойством; вставка компоненты в заданное место списка (обычно до компоненты с заданным ключом или после неё); исключение компоненты с заданным ключом из списка. упорядочивание узлов линейного списка в определенном порядке

 Type Ptr. Rec = ^Rec; Rec = Record Element : Type. Element; {Информационное Type Ptr. Rec = ^Rec; Rec = Record Element : Type. Element; {Информационное поле} p. Next : Ptr. Rec; {Ссылка на следующую компоненту} End;

переменные p. Begin определяет начало списка p. CKey указатель на компоненту с заданным ключем переменные p. Begin определяет начало списка p. CKey указатель на компоненту с заданным ключем p. Pred. Rec указатель на компоненту перед заданным ключем p. Aux временный указатель Var p. Begin, p. CKey, p. Pred. Rec, p. Aux : Ptr. Rec;

формирование однонаправленного списка с сохранением порядка поступающих элементов Var p. Begin, p. Aux : формирование однонаправленного списка с сохранением порядка поступающих элементов Var p. Begin, p. Aux : Ptr. Rec; Elem : Integer; Отведем место для указателей p. Begin и p. Aux, переменной Elem в статической области памяти

 New (p. Begin); В динамической области памяти резервируем место для динамического объекта p. New (p. Begin); В динамической области памяти резервируем место для динамического объекта p. Begin

 Read. Ln (Elem); p. Begin^. Element : = Elem; p. Begin^. p. Next Read. Ln (Elem); p. Begin^. Element : = Elem; p. Begin^. p. Next : = Nil; Определим информационное поле и ссылку нового звена

 p. Aux : = p. Begin; p. Aux ссылается на построенное звено p. Aux : = p. Begin; p. Aux ссылается на построенное звено

Заполняем список, пока не выполнится условие Write ('Задайте первый элемент '); Read. Ln (Elem); Заполняем список, пока не выполнится условие Write ('Задайте первый элемент '); Read. Ln (Elem); While Elem <>. . . Do Begin New (p. Aux^. p. Next);

Резервирование места под новое звено Резервирование места под новое звено

передвигаем указатель p. Aux : = p. Aux^. p. Next; передвигаем указатель p. Aux : = p. Aux^. p. Next;

 p. Aux^. Element : =Elem; p. Aux^. p. Next : = Nil; p. Aux^. Element : =Elem; p. Aux^. p. Next : = Nil;

 Write ('Задайте следующий элемент '); Read. Ln (Elem); End; Write ('Задайте следующий элемент '); Read. Ln (Elem); End;

 Procedure Create_List 1 (var p. Begin: Ptr. Rec); var p. Aux : Ptr. Procedure Create_List 1 (var p. Begin: Ptr. Rec); var p. Aux : Ptr. Rec; Elem : Integer; Begin New (p. Begin); Write. Ln ('Введите элементы списка: '); Read. Ln (Elem); If Elem <> 0 Then Begin p. Begin^. Element : = Elem; {Формирование первого звена} p. Begin^. p. Next : = Nil; p. Aux : = p. Begin; Read. Ln (Elem); {Формирование остальных звеньев} While Elem <> 0 do Begin New (p. Aux^. p. Next); p. Aux : = p. Aux^. p. Next; p. Aux^. Element : = Elem; p. Aux^. p. Next : = Nil; Read. Ln (Elem); End; End Else Begin p. Begin : = Nil; Write. Ln ('Список пуст!') End;

вывод элементов однонаправленного списка Procedure Print_List 1 (p. Begin : Ptr. Rec); var p. вывод элементов однонаправленного списка Procedure Print_List 1 (p. Begin : Ptr. Rec); var p. Aux : Ptr. Rec; {текущий указатель} Begin If p. Begin = Nil Then Write. Ln ('Список пуст!') Else Begin p. Aux : = p. Begin; {Просмотр начнем с первого элемента} While p. Aux <> Nil do {пока не достигнут конец списка} Begin Write (p. Aux^. Element : 4); {выводим элемент} p. Aux : = p. Aux^. p. Next; {переходим на следующий} End; Write. Ln; End;

однонаправленные списки с заглавным звеном однонаправленные списки с заглавным звеном

два способа построения Каждый новый элемент добавляется в начало или в конец списка. Каждый два способа построения Каждый новый элемент добавляется в начало или в конец списка. Каждый элемент добавляется в свое место в списке, например, так, чтобы обеспечить упорядоченность по возрастанию или убыванию.

Отведем место для указателей p. Begin и p. Aux, переменной Elem в статической области Отведем место для указателей p. Begin и p. Aux, переменной Elem в статической области памяти Var p. Begin, p. Aux : Ptr. Rec; Elem : Integer;

В динамической области памяти резервируем место для динамического объекта p. Begin New (p. Begin); В динамической области памяти резервируем место для динамического объекта p. Begin New (p. Begin);

Переменная p. Aux ссылается на заглавное звено p. Aux : = p. Begin; Переменная p. Aux ссылается на заглавное звено p. Aux : = p. Begin;

Определим ссылку заглавного звена (следующего элемента возможно и не будет) p. Aux^. p. Next Определим ссылку заглавного звена (следующего элемента возможно и не будет) p. Aux^. p. Next : = NIL;

Заполняем список, пока не выполнится условие Write ('Задайте первый элемент '); Read. Ln (Elem); Заполняем список, пока не выполнится условие Write ('Задайте первый элемент '); Read. Ln (Elem); While Elem <>. . . Do Begin New (p. Aux^. p. Next);

Резервирование места под новое звено Резервирование места под новое звено

 p. Aux : = p. Aux^. p. Next; {передвигаем указатель} p. Aux : = p. Aux^. p. Next; {передвигаем указатель}

Заполнение нового звена списка данными p. Aux^. Element : =Elem; p. Aux^. p. Next Заполнение нового звена списка данными p. Aux^. Element : =Elem; p. Aux^. p. Next : = Nil;

 Procedure Create_List (var p. Begin : Ptr. Rec); var p. Aux : Ptr. Procedure Create_List (var p. Begin : Ptr. Rec); var p. Aux : Ptr. Rec; Elem : Integer; Begin New (p. Begin); p. Aux : = p. Begin; p. Aux^. p. Next : = Nil; {Построили пустой список с заглавным звеном} Write ('Задайте первое целое число '); Read. Ln (Elem); While Elem <> 0 do Begin New (p. Aux^. p. Next); p. Aux : = p. Aux^. p. Next; p. Aux^. Element : = Elem; p. Aux^. p. Next: = Nil; Write ('Следующий элемент '); Read. Ln (Elem); End; Write. Ln; End;

определение наличия элементов в однонаправленном списке с заглавным звеном определение наличия элементов в однонаправленном списке с заглавным звеном

Проверка на пустоту Function Empty_List (p. Begin: Ptr. Rec) : Boolean; Begin Empty_List : Проверка на пустоту Function Empty_List (p. Begin: Ptr. Rec) : Boolean; Begin Empty_List : = p. Begin^. p. Next = Nil; End;

рекурсивное формирование однонаправленного списка с заглавным звеном Procedure Create_List_Re (var p. List : Ptr. рекурсивное формирование однонаправленного списка с заглавным звеном Procedure Create_List_Re (var p. List : Ptr. Rec); {Построение списка} var El : Type. Element; Begin Write ('Элемент '); Read. Ln (El); If El <> 0 Then Begin New (p. List^. p. Next); p. List^. p. Next^. Element : = El; p. List^. p. Next : = Nil; Create_List_Re (p. List^. p. Next); End;

процесс выполнения основных операторов данной рекурсивной процедуры процесс выполнения основных операторов данной рекурсивной процедуры

 New (List^. p. Next); {определяем место для нового компонента} List^. p. Next^. Element New (List^. p. Next); {определяем место для нового компонента} List^. p. Next^. Element : = El; List^. p. Next : = Nil; {заполняем информационное поле и ссылку нового звена} Create_List_Re (List^. p. Next); {процесс формирования списка продолжим дальше}

перед вызовом этой рекурсивной процедуры следует сформировать заглавное звено New (p. Begin); p. Begin^. перед вызовом этой рекурсивной процедуры следует сформировать заглавное звено New (p. Begin); p. Begin^. p. Next : = Nil; Write. Ln ('Задайте элементы списка (ввод закончите 0). . . '); Create_List_Re (p. Begin); Write. Ln;

просмотр элементов однонаправленного списка с заглавным звеном p. Aux типа указатель является ссылка на просмотр элементов однонаправленного списка с заглавным звеном p. Aux типа указатель является ссылка на некоторый элемент списка целых чисел p. Aux: = p. Aux^. p. Next;

Проход по списку Проход по списку

 Procedure Print_List (p. Begin : Ptr. Rec); var p. Aux : Ptr. Rec; Procedure Print_List (p. Begin : Ptr. Rec); var p. Aux : Ptr. Rec; {текущий указатель} Begin p. Aux : = p. Begin^. p. Next; {Исключаем из просмотра заглавное звено} While p. Aux <> Nil do {пока не конец списка} Begin Write (p. Aux^. Element : 4); p. Aux : = p. Aux^. p. Next; {перейдем к следующему элементу} End; Writeln; End;

Проверка на пустоту If p. Begin^. p. Next = Nil Then Write. Ln ('Список Проверка на пустоту If p. Begin^. p. Next = Nil Then Write. Ln ('Список пуст!') Else Print_List (p. Begin^. p. Next);

рекурсивная процедура вывода элементов однонаправленного списка с заглавным звеном Procedure Print_List_Re (p. List : рекурсивная процедура вывода элементов однонаправленного списка с заглавным звеном Procedure Print_List_Re (p. List : Ptr. Rec); {здесь p. List - указатель на звено, следующее за заглавным звеном} Begin If p. List <> Nil then Begin Write (p. List^. Element : 4); Print_List_Re (p. List^. p. Next); End;

поиск компоненты {Исключаем из просмотра заглавное звено} p. CKey : = p. Begin^. p. поиск компоненты {Исключаем из просмотра заглавное звено} p. CKey : = p. Begin^. p. Next; {пока не конец списка и в списке ключ Key не найден} While (p. CKey <> Nil) and (p. CKey^. Element <> Key) do p. CKey : = p. CKey^. p. Next; {будем осуществлять переход к следующему элементу списка}

Ф-я поиска Function Find_Key 1 (p. Begin: Ptr. Rec; Key: Type. Element; var p. Ф-я поиска Function Find_Key 1 (p. Begin: Ptr. Rec; Key: Type. Element; var p. CKey: Ptr. Rec) : Boolean; var p. Aux : Ptr. Rec; Begin Find_Key 1 : = False; p. CKey : =Nil; {предположим, что не нашли} p. Aux : = p. Begin^. p. Next; {исключаем из рассмотрения заглавное звено} While (p. Aux <> Nil) and (p. Aux^. Element <> Key) do p. Aux : = p. Aux^. p. Next; {сместили указатель} If p. Aux <> Nil Then {Элемент найден} Begin Find_Key 1 : = True; p. СKey : = p. Aux; End;

Итереционная ф-я Function Find (p. Begin: Ptr. Rec; Key: Type. Element; var p. СKey: Итереционная ф-я Function Find (p. Begin: Ptr. Rec; Key: Type. Element; var p. СKey: Ptr. Rec) : Boolean; var p. Aux : Ptr. Rec; Begin Find : = False; p. СKey : = Nil; p. Aux : = p. Begin^. p. Next; While (p. Aux <> Nil) and (p. СKey = Nil) do Begin If p. Aux^. Element = Key Then Begin Find : = True; p. СKey : = p. Aux; End; p. Aux : = p. Aux^. p. Next; End;

Рекурсивная ф-я Function Find_Кеу (p. List: Ptr. Rec; Key: Integer; var p. СKey: Ptr. Рекурсивная ф-я Function Find_Кеу (p. List: Ptr. Rec; Key: Integer; var p. СKey: Ptr. Rec) : Boolean; {p. List - указатель на список, в котором ведется поиск} {Key - заданный ключ , p. СKey - указатель на найденное звено} var b : Boolean; Begin b : = False; If (not b) and (p. List <> Nil) Then If p. List^. Element = Key Then b : = True Else b : = Find_Key (p. List^. p. Next, Key, p. СKey); Find_Key : = b; p. СKey : = p. List; End;

Вставка перед ключом нового элемента в список Вставка перед ключом нового элемента в список

В динамической области памяти резервируем место для динамического объекта New(p. New); В динамической области памяти резервируем место для динамического объекта New(p. New);

 В информационное поле нового объекта p. New помещаем значение информационного поля элемента, на В информационное поле нового объекта p. New помещаем значение информационного поля элемента, на который указывает p. CKey. В поле ссылки на следующий элемент указателя p. New помещаем адрес элемента, следующего за компонентом, на которое указывает p. CKey p. New^. Element : = p. CKey^. Element; p. New^. p. Next : = p. CKey^. p. Next;

 В информационное поле элемента, на который указывает p. CKey, помещаем новое значение. В В информационное поле элемента, на который указывает p. CKey, помещаем новое значение. В поле ссылки на следующий элемент указателя p. CKey помещаем адрес элемента, на который указывает p. New: p. CKey^. Element : = Elem; p. CKey^. p. Next : = p. New;

 Procedure Insert_Element 1(Elem : Integer; p. CKey : Prt. Rec); var p. New Procedure Insert_Element 1(Elem : Integer; p. CKey : Prt. Rec); var p. New : Ptr. Rec; Begin New(p. New); p. New^. Element : = p. CKey^. Element; {эти две строки можно} p. New^. p. Next : = p. CKey^. p. Next; {заменить p. New^ : = p. CKey^; } p. CKey^. Element : = Elem; p. CKey^. p. Next : = p. New; End;

Вставка за ключом нового элемента в список Procedure Insert_Element 2(Elem : Integer; p. CKey Вставка за ключом нового элемента в список Procedure Insert_Element 2(Elem : Integer; p. CKey : Ptr. Rec); var p. New : Ptr. Rec; Begin New(p. New); p. New^. Element : = Elem; If p. CKey <> Nil Then {Если p. CKey не последний в списке, } p. New^. p. Next : = p. CKey^. p. Next {то разрываем старую связь} Else {p. CKey - последний в списке} p. New^. p. Next : = Nil; p. CKey^. p. Next : = p. New; {образовали новую связь} End;

Удаление элемента однонаправленного списка Procedure Delete_Element (p. CKey: Ptr. Rec); var p. Aux : Удаление элемента однонаправленного списка Procedure Delete_Element (p. CKey: Ptr. Rec); var p. Aux : Ptr. Rec; Begin p. Aux : = p. CKey^. p. Next; If p. CKey^. p. Next <> Nil Then Begin p. CKey^. p. Next : = p. CKey^. p. Next; Dispose (p. Aux); End;