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

If IsEmpty(Text2) Then Exit Sub

If count = 1 then

MsgBox “Счет закончен” : Exit Sub

End If

For k = 1 To Val(Text2.Text)

If (cur IsNothing) AND (k = 1) Then

Set cur = first

Else

Set cur = cur.Nxt : m = cur.Num 'переход по ссылке

End if

Next : MsgBox “Выбрали” & Str(m) & “-го

Set cur.Pre.Nxt = cur.Nxt

Set cur.Nxt.Pre = cur.Pre 'изменение ссылки

Count = count – 1 : Display

End Sub

Private Sub Display() ' вывод информации в Text1

Dim cell As Circ, txt As String, k As long

If cur IsNothing Then Set cell = first Else Set cell = cur.Nxt

Txt = Str(cell.Num)

For k = 1 To count – 1 : Set cell = cell.Nxt

Txt = txt & “,” & Str(cell.Num)

Next

Text1.Text = txt

End Sub

Нажатие кнопки “Initia” создает простейший круг из двух человек. Кнопка “Add” позволяет вставить в круг еще одного человека со следующим номером. Номера участников “считалки” помещены в текстовое окно Text1. Размер круга ограничивается форматом Long целых чисел. В текстовое окно Text2 следует ввести число – модуль пересчета k. Нажатие кнопки “Delete” удаляет из круга k-го участ-ника, считая от последнего удаления или от первого, если удалений еще не было. Схему ссылок в этом примере можно представить на-глядно в следующем виде (см. рис. 3):

• • • • • •

Рис. 3

Ссылок может быть сколько угодно, поэтому такие конструкции удо-бны для организации работы с очередями, деревьями, базами данных. Например, при построении дерева ссылок (что может использоваться для организации базы данных, упорядочения вводимой информации в скрытой форме и др.) каждый элемент (ячейка, или узел дерева) дол-жен иметь один “вход” (ссылку) и несколько “выходов” (тоже ссыл-ки): . Кроме того, каждый узел должен нести ка-кую-то смысловую информацию и информацию, характеризующую этот узел. Так, при обходе дерева полезно знать, посещался ли этот узел (логическое поле), номер этого узла (поле целого типа), отноше-ние к предыдущему узлу и т. д. Пусть в простейшем варианте двоич-ное дерево (один вход и не более двух выходов) предназначено для анализа числовой информации. Можно определить модуль класса

BTree (в свойствах класса установим имя класса BTree):

Option Explicit

Public Bul As Boolean ' признак посещения узла

Public Ind As Integer ' отношение с предыдущим узлом

Public Num As Long ' номер узла по порядку (счетчик)

Public Value As Single ' значение (информационное поле)

Public Pre As BTree ' cсылка на предыдущий узел

Public Le As Btree ' ссылка на первый (левый) выход

Public Ri As BTree ' ссылка на второй (правый) выход

Далее определим метод класса, устанавливающий для элемента класса

значение и порядковый номер, очищая остальные поля:

Public Sub Init(a As Single, i As Long)

Num = i : Value = a : Bul = True : Ind = 0

Set Pre = Nothing : Set Le = Nothing

Set Ri = Nothing

End Sub

Ссылки Pre, Le, Ri являются в определении класса формальными. Они становятся реальными при формировании объекта с помощью опера-тора New BTree в общем разделе определений (раздел Dim ). Для того, чтобы передвигаться по дереву от корня (первого узла) к какой-нибудь вершине, выбирая левую или правую ветвь, можно рабочему объекту (Current) присвоить значение первого узла (пусть его имя First): Set Current = First, а затем переходить на левую (правую) ветвь: Set Current = Current.Le (или Set Current=Current.Ri) до тех пор, пока не при-дем в вершину, т. е. когда Current.Le Is Nothing или Current.Ri Is Nothing. Присваивание осуществляется со всеми фактическими связями. Таким образом, если необходимо в нужном месте сделать изменения в пост-роенном дереве, можно использовать рабочую ячейку для необходи-мой ссылки. Например, если рабочая ячейка оказалась левой ветвью (это можно узнать по ее индексу – свойство Ind), то изменить свой-ство Bul соответствующего узла дерева можно с помощью двойной ссылки: Current.Pre.Le.Bul = False, так как ссылки здесь уже фактические.

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