Re[2]: Б-деревья (b-trees) - need help
От: lurker Россия  
Дата: 22.12.04 15:53
Оценка:
Здравствуйте, Багер, Вы писали:

Б>Здравствуйте, lurker, Вы писали:


L>>исходник реализации поиска с вставкой и удаления на б-деревьях

Б>собственно и есть наиполнейшая реализация шесть-дерева 8))
L>>Язык значения не имеет.
Б>язык русский %))
L>>Комментарии приветствуются.
Б>практически одни коментарии

Б>Дерево

Б>(
Б> Дерево адресЭтотЭлемент;
Б> Дерево адресБольшее;
Б> Дерево адресМеньшее;
Б> Знач;
Б>)адресКореньДерева;
Б>адресКореньДерева.Меньшее= адресНУЛЬ;
Б>адресКореньДерева.Большее= адресНУЛЬ;
Б>адресКореньДерева.Знач= 0;
Б>адресКореньДерева.адресЭтотЭлемент= адресКореньДерева;

Б>Дерево адресЭлементДерева;

Б>Дерево адресРезультат;
Б>Дерево адресПапа;
Б>ИскомоеЗнач;

Б>Функция Дерево::Искать()

Б> Если ИскомоеЗнач = адресЭтотЭлемент.Знач Тогда
Б> адресРезультат= адресЭтотЭлемент;
Б> Возврат адресНУЛЬ;
Б> Иначе
Б> адресПапа= адресЭтотЭлемент;
Б> Если ИскомоеЗнач< адресЭтотЭлемент.Знач Тогда
Б> Возврат адресЭтотЭлемент.адресМеньшее;
Б> Иначе
Б> Возврат адресЭтотЭлемент.адресБольшее;
Б> КонецЕсли
Б> КонецЕсли
Б>КонецФункции

Б>Процедура Дерево::НачатьПоиск(Дерево адресЭлементДерева)

Б> адресРезультат= адресНУЛЬ;
Б> адресПапа= адресЭтотЭлемент;
Б> Если адресЭлементДерева = адресНУЛЬ Тогда
Б> Возврат;
Б> КонецЕсли
Б> Пока ( (адресЭлементДерева:= адресЭлементДерева.Искать()) НЕ= адресНУЛЬ ) Цикл
Б> КонецЦикла
Б>КонецПроцедуры

Б>Процедура КУдалению()

Б> Если адресПапа.Большее = адресРезультат Тогда
Б> Если (адресПапа.адресБольшее:= адресРезультат.адресМеньшее) = адресНУЛЬ Тогда
Б> адресПапа.адресБольшее= адресРезультат.адресБольшее;
Б> Возврат;
Б> КонецЕсли
Б> Иначе
Б> Если (адресПапа.адресМеньшее:= адресРезультат.адресМеньшее) = адресНУЛЬ Тогда
Б> адресПапа.адресМеньшее= адресРезультат.адресБольшее;
Б> Возврат;
Б> КонецЕсли
Б> КонецЕсли

Б> Если адресРезультат.адресБольшее = адресНУЛЬ Тогда

Б> Возврат;
Б> КонецЕсли
Б> Дерево адресВременнаяВетка= адресРезультат;
Б> ИскомоеЗнач= адресРезультат.Знач;

Б> адресРезультат.НачатьПоиск(адресРезультат.адресМеньшее);


Б> адресПапа.адресБольшее= адресВременнаяВетка.Большее;

Б> адресРезультат= адресВременнаяВетка;
Б>КонецПроцедуры

Б>Процедура Вставить()

Б> адресКореньДерева.Знач= ИскомоеЗнач;
Б> адресКореньДерева.НачатьПоиск(адресКореньДерева.адресБольшее);
Б> Если адресРезультат НЕ= адресНУЛЬ Тогда
Б> Сообщить( "Элемент уже есть" );
Б> Возврат;
Б> КонецЕсли;
Б> Если ИскомоеЗнач< адресПапа.Знач Тогда
Б> адресРезультат= (адресПапа.адресМеньшее= ВыделитьПамять Дерево);
Б> Иначе
Б> адресРезультат= (адресПапа.адресБольшее= ВыделитьПамять Дерево);
Б> КонецЕсли
Б> адресРезультат.Меньшее= адресНУЛЬ;
Б> адресРезультат.Большее= адресНУЛЬ;
Б> адресРезультат.Знач= ИскомоеЗнач;
Б> адресРезультат.адресЭтотЭлемент= адресРезультат;
Б>КонецПроцедуры

Б>функция НайтиИПерепрятать()

Б> ИскомоеЗнач= ?;
Б> адресКореньДерева.НачатьПоиск(адресКореньДерева.адресБольшее);

Б> Если адресРезультат = адресНуль Тогда

Б> Сообщить( "Нет элемента" );
Б> Иначе
Б> Сообщить( "Адрес элемента: " + строка( адресРезультат ) );
Б> КУдалению();
Б> адресРезультат.адресБольшее= адресНУЛЬ;
Б> адресРезультат.адресМеньшее= адресНУЛЬ;
Б> УдалитьПамять адресРезультат;
Б> Вставить();
Б> КонецЕсли
Б>КонецФункции

Конечно прикольно, а можно теперь компилятор под это дело?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.