NIL, NULL и маленькие хитрости
Нередко алгоритмы, просто выглядящие на бумаге, становятся нагромождением сплошных конструкций if в реальной программе. Почему?
Ответ очевиден: многие алгоритмы для работы с деревьями предполагают, что
(NIL).parent == (NIL).left == (NIL).right == NIL. Вроде всё ясно и даже
логично, но ведь во многих языках программирования NIL/NULL – это ноль. А
обращение по нулевому адресу памяти чревато нехорошими вещами. Что же делать?
Ведь мало того, что все эти if тормозят программу, в них легко запутаться!
Решение просто: мы не будем использовать NIL! Действительно, алгоритмам
совершенно всё равно, какое численное значение имеет NIL, главное, чтобы адрес
любой реальной вершины в дереве не был ему равен. Поэтому вместо NIL мы будем
использовать адрес переменной, проинициализированной особым образом. Я покажу
это на языке С++, но думаю, этот пример можно будет перевести и на другие
языки, хотя там, скорее всего, нет шаблонов, и придется пожертвовать
типобезопасностью.
template <class CTree>class CTreeBase
{
protected:
CTree * lpCParent;
CTree * lpCLeft;
CTree * lpCRight;
public:
CTreeBase(CTreeBase *
lpCParentInit, CTreeBase * lpCLeftInit,
CTreeBase * lpCRightInit)
{
lpCParent = (CTree
*)lpCParentInit;
lpCLeft = (CTree *)lpCLeftInit;
lpCRight = (CTree *)lpCRightInit;
}
};
/////////////////////////////////////
class CTree : public CTreeBase<CTree>
{
private: Рекомендуем скачать другие рефераты по теме: шпаргалки по математике, шпаргалки по гражданскому.
Предыдущая страница реферата | 3
4
5
6
7
8
9
10
11
12
13 | Следующая страница реферата
|
|