Вы находитесь на странице: 1из 8

МИНИСТЕРСТВО ОБРАЗОВАНИЯ АЗЕРБАЙДЖАНСКОЙ РЕСПУБЛИКИ

АЗЕРБАЙДЖАНСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра: Информационные технологии и программирование


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

Самостоятельная работа 5
на тему
Односвязный список,
как самостоятельная структура данных

Педагог: Nargiz Miriyeva


Курс: 2
Группа: 689r
Студент: Mustafa Afzali
Односвязный список
как самостоятельная структура данных
Просмотр односвязного списка может производиться только последовательно, начиная с головы (с

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

к началу списка. Это - недостаток односвязных списков по сравнению со статическими структурами

типа массива. Списковая структура проявляет свои достоинства, когда число элементов списка

велико, а вставку или удаление необходимо произвести внутри списка.

Пример:

Необходимо вставить в существующий массив элемент X между 5 и 6 элементами.


Для проведения данной операции в массиве нужно сместить “вниз” все элементы, начиная с X6 -

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

Данная процедура может занимать очень значительное время. В противоположность этому, в

связанном списке операция вставки состоит в изменении значения 2-х указателей и генерации

свободного элемента. Причём время, затраченное на выполнение этой операции, является

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


Вставка и извлечение элементов из списка
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
Реализация стеков с помощью односвязных списков
Любой односвязный список может рассматриваться в виде стека. Однако список по сравнению со

стеком, реализованным на одномерном массиве имеет преимущество, так как заранее не задан

его размер.

Стековые операции, применимые к спискам

Чтобы добавить элемент в стек, надо в алгоритме вставки в начало списка заменить указатель Lst

на указатель S (операция Push(S, x).

P = GetNode

Info(P) = x

Ptr(P) = S

S=P

return

Проверка стека на пустоту Empty(S)

if S = Nil

then print “Стек пуст”

Stop

endif

return

Выборка элемента из стека POP(S)

Empty(S)

P=S

X = Info(P)

S = Ptr(P)

FreeNode(P)

return

Заметим, что проверку на переполнение для стека в виде списка делать не нужно.
Примеры типичных операций над списками
Задача 1
Требуется просмотреть список и удалить элементы, у которых информационные поля равны 4.
Обозначим P - рабочий указатель; в начале процедуры P = Lst.
Введем также указатель Q, который отстает на один элемент от P.
Когда указатель P найдет элемент, последний будет удален относительно указателя Q как
последующий элемент.

Алгоритм

x=4

Q = nil

P = Lst

while P <> nil do

if info(P) = x then

if Q = nil then

Pop(Lst)

P = Lst

else

DelAfter(Q)

endif

else

Q=P

P = Ptr(P)

endif

endwhile
return
Задача 2
Дан упорядоченный по возрастанию info - полей список. Необходимо вставить в этот список
элемент со значением X, не нарушив упорядоченности списка.

Пусть X = 16

Начальные условия:
Q = Nil, P = Lst

Алгоритм

X = 16

Q =Nil

P = Lst

while (P <> nil) and (X > info(P)) do

Q=P

P = Ptr(P)

endwhile

if Q = nil then

Push(Lst, X)

endif

InsAfter(Q, X)

return

Вам также может понравиться