Сборник по задачам и примерам Assembler


Двусвязные списки - часть 2


itemjist struc ; элемент списка

prev dd 0 :адрес предыдущего элемента

info db 0 содержательная часть (в нашем случае - символ)

next dd 0 :адрес следующего элемента

ends

;предполагаем, что адрес локализованного элемента находится в регистре ЕВХ.

:а адрес нового элемента - в ЕАХ

push [ebx].next

pop [eax].next :[ebx].next->[eax].next mcv [eax].prev.ebx;адрес предыд. эл-та->[еах].ргеу mov [ebx].next.eax:адрес след. эл-та->[еЬх].пех1

:будьте внимательны - меняем указатель предыд. эл-та в следующем за новым элементом mov ebx.[eax].next;адрес след. эл-та-KebxJ.next mov [ebx].prev.eax;адрес предыд. эл-та->[еЬх].ргеу

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

Исключение из списка

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

itemjist struc ;элемент списка

prev dd 0 ;адрес предыдущего элемента

info db 0 содержательная часть (в нашем случае - символ)

next dd 0 -.адрес следующего элемента

ends

предполагаем, что адрес локализованного элемента находится в регистре ЕВХ

mov eax.[ebx].prev;адрес предыд. эл-та->еах

push [ebx].next

pop [eax].next

mov eax.[ebx].next ;адрес следующ. эл-та->еах

push [ebx].prev

pop [eax].prev

В общем случае одно- и двусвязные списки представляют собой линейные связанные структуры. Но в определенных случаях второй указатель двусвязного списка может задавать порядок следования элементов, не являющийся обратным по отношению к первому указателю (Рисунок 2.14).

Рисунок 2.14. Логическая структура нелинейного двусвязного списка

 




- Начало -  - Назад -  - Вперед -