Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы аисд.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.94 Mб
Скачать

Утилизация освободившихся элементов в многосвязных списках

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

Метод счетчиков

В каждый элемент многосвязного списка вставляется поле счетчика, который считает количество ссылок на данный элемент. Когда счетчик элемента оказывается в нулевом состоянии, а поля указателей элемента находятся в состоянии nil, этот элемент может быть возвращен в пул свободных элементов.

Второй способ утилизации - метод маркера (сборки мусора, то есть неиспользуемых элементов)

Метод маркера 

 Если с каким-то элементом установлена связь, то однобитовое поле элемента (маркер) устанавливается в “1”, иначе - в “0”. По сигналу переполнения отыскиваются элементы, у которых маркер установлен в ноль, т. е. включается программа сборки мусора, которая просматривает всю отведенную память и возвращает в список свободных элементов все элементы, не помеченные маркером. 

13.Очередь и операции над ней при реализации связными списками

Операции с очередью, применимые к спискам.

Указатель начала списка принимаем за указатель начала очереди F, а указатель R, указывающий на последний элемент списка - за указатель конца очереди.

Проверка очереди на пустоту

Empty(Q)

If F = nil

  then print “Очередь пуста”

  Stop

endif

return

 

Операция удаления из очереди  Remove(Q)

Операция удаления из очереди должна происходить из ее начала.

Remove(Q) 

If F = nil

  then print “Очередь пуста”

  Stop

endif

P = F

F = Ptr(P)

X = Info(P)

FreeNode(P)

return

 

Операция вставки в очередь

Insert(Q, x)

Операция вставки в очередь должна осуществляться к ее концу.

Insert(Q, x)

P = GetNode

Info(P) = x

Ptr(P) = Nil

Ptr(R)= P

R = P

return

14.Операции вставки и извлечения элементов из списка. Сравнение этих операций с аналогичными в массивах. Недостаток связного списка по сравнению с массивом.

Вставка и извлечение элементов  из  списка

Cначала определяем элемент, после которого необходимо провести операцию вставки или удаления.

Вставка производится с помощью функции InsAfter(P, x), а удаление - DelAfter(P).

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

Вставка  InsAfter(P, x)

Пусть необходимо вставить новый элемент с информационным полем x после элемента, на который указывает рабочий указатель P.

          1) Необходимо сгенерировать новый элемент.

Q = GetNode

          2) Информационному полю этого элемента присвоить значение X.  

Info(Q) = x

          3) Вставить полученный элемент.  

    Ptr(Q) = Ptr(P)

    Ptr(P) = Q

Это и есть функция InsAfter(Q, X), алгоритм которой ниже

Q = GetNode

info(Q) = x

ptr(Q) = ptr(P)

ptr(P) = Q

return

 

Удаление DelAfter(P)

Пусть необходимо удалить элемент списка, который следует после элемента, на который указывает рабочий указатель P.

Для этого:

1) Присваиваем Q значение указателя на удаляемый элемент.

Q = Ptr(P)

2) В переменную  X сохраняем значение информационного поля удаляемого элемента.  

X = Info(Q) 

3) Меняем значение указателя на удаляемый элемент на значение указателя на следующий элемент и производим удаление . 

    Ptr(P) = Ptr(Q)

    FreeNode(Q)

Это и есть процедура DelAfter(P, X), ниже записан алгоритм

Q = ptr(P)

X = info(Q)

ptr(P) = ptr(Q)

FreeNode(Q)

return

При работе с односвязным спиком доступ имеется к его началу, поэтому, для вставки или удаления любого элемента, кроме первого, необходим алгоритм просмотра односвязного списка

Алгоритм просмотра односвязного списка при вставке и удалении

Q =Nil

P = Lst

while (P <> nil) do

    Q = P

    P = ptr(P)

endwhile

return

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