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

Коношима 16 мм подробности здесь. |

Односвязные списки - часть 4


Включение в список

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

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

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

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

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

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

mov edx.[ebx].next

mov [eax].next.edx mov [ebx].next.eax

Для включения нового элемента после локализованного возникает проблема, I источник которой в однонаправленности односвязного списка, так как, по определению, проход к предшествующему элементу невозможен. Можно, конечно, включить новый элемент, как показано выше, а затем попросту обменять содержимое этих элементов. К примеру, это может выглядеть так:

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

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

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

ends

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

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

mov edx.[ebx].next mov [eax].next.edx mov edx.[ebx].info mov [eax].info.edx mov [ebx].next.eax

:осталось заполнить поле info нового элемента

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

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

item_list struc :элемент списка

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

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

ends

.data

ins_itern itemjist <.15> вставляемый элемент (поле info содержит значение -

:критерий вставки)

Headjist dd Offffffffh указатель на начало списка (Offffffffh - список пуст) Hand_Head dd 0 ;переменная, в которой хранится дескриптор кучи




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