Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Teoria 158783 .doc
Скачиваний:
6
Добавлен:
25.09.2019
Размер:
1.72 Mб
Скачать

Удаление элемента

Пусть в программе имеется описание типа, приведенное в примере 7.8.

Алгоритм удаления элемента:

  1. Занесение в поле Adrpred следующего за удаляемым звена ссылки на предшествующее удаляемому звено из поля Adrpred удаляемого звена;

  2. Занесение в поле Adrcled предшествующего удаляемому звена ссылки на следующее за удаляемым звено из поля Adrcled удаляемого звена;

  3. Уничтожение удаляемого звена.

На двух следующих рисунках приведены схематические пояснения к удалению элемента из двунаправленного списка.

Пусть в изображенном фрагменте исходного списка удаляется звено 2 (Рисунок 7 .68).

Рисунок 7.68 – Фрагмент исходного двунаправленного списка

Результат удаления звена 2 выглядит так, как иллюстрирует Рисунок 7 .69.

Номера связей на данном рисунке соответствуют номерам этапов алгоритма удаления.

Рисунок 7.69 - Результат удаления звена 2

Пример 7.11.

Процедура удаления звена из двунаправленного списка. Номера операторов соответствуют номерам этапов алгоритма удаления звена.

Procedure Udalen (Udzv: Adr2); {Udzv – ссылка на удаляемое звено}

Begin

{1} Udzv^.Adrcled^.Adrpred := Udzv^.Adrpred;

{2} Udzv^.Adrpred^.Adrcled := Udzv^.Adrcled;

{3} Dispose (Udzv);

End;

Поиск элемента

Поиск элемента в двунаправленном кольцевом списке аналогичен поиску элемента в цепочке (см. п. 7.1.3).

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

Пример 7.12.

Логическая функция поиска элемента в двунаправленном кольцевом списке с заглавным звеном. Если искомый элемент в списке есть, возвращаемое значение функции равно True, а параметру Iskadr присваивается ссылка на звено, содержащее данный элемент.

Function Poisk (Adr: Adr2; Elem: <Тип_элемента_списка>; Var Iskadr: Adr2):

Boolean; {Adr – ссылка на заглавное звено;

Elem – искомый элемент;

Iskadr – адрес искомого элемента}

Var

P, Q: Adr2; {В Р будет храниться адрес заглавного

звена, в Q – адрес текущего звена}

B: Boolean;

Begin

B := False; {B – логическая переменная (факт

наличия искомого элемента)}

P := Adr; {В P занесен адрес заглавного звена}

Iskadr := Nil;

Q:=P^.Adrcled; {В Q занесен адрес первого звена}

While (P<>Q) And Not B Do {Поиск, пока не дошли до заглавного

звена и не нашли искомый элемент}

Begin

If Q^.Element = Elem Then {Найден искомый элемент}

Begin

B := True;

Iskadr := Q {Адрес искомого элемента}

End;

Q := Q^.Adrcled {Переход к следующему звену}

End;

Poisk := B {Возвращаемое значение}

End;

Очереди и стеки

В программировании имеется структура данных, называемая очередью. Понятие очереди в программировании аналогично понятию реальной очереди из повседневной жизни.

Очередь является динамической структурой. Длина очереди и набор образующих ее элементов изменяется с течением времени.

Над очередью определены две операции:

  • занесение элемента в очередь (заказа на обслуживание);

  • выбор элемента из очереди (для его обслуживания); выбранный элемент из очереди исключается.

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

Различают два основные вида очередей, отличающиеся по дисциплине (способу) обслуживания находящихся в них элементов.

В первом виде очередей заказ, поступивший в очередь первым, выбирается первым для обслуживания и удаляется из очереди. Это дисциплину обслуживания очереди называют FIFO (First In – First Out – первый в очередь – первый из очереди).

Во втором виде очередей заказ, поступивший в очередь последним, выбирается первым для обслуживания и удаляется из очереди. Эту дисциплину обслуживания называют LIFO (Last In – First Out – последний в очередь – первый из очереди).

Очередь второго вида называется стеком.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]