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

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

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

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

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

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

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

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

Если адресРезультат.адресБольшее = адресНУЛЬ Тогда
Возврат;
КонецЕсли
Дерево адресВременнаяВетка= адресРезультат;
ИскомоеЗнач= адресРезультат.Знач;

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

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

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

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

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

Делаю потенциальные фичи :))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.