14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()

14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()

Наконец, вы можете удалить элементы из дерева и, на системах GLIBC, удалить само дерево целиком:

void *tdelete(const void *key, void **rootp,

int (*compare)(const void*, const void*));

/* Расширение GLIBC, в POSIX нет: */

void tdestroy(void *root, void (*free_node)(void *nodep));

Аргументы для tdelete() те же, что и для tsearch(): ключ, адрес корня дерева и функция сравнения. Если в дереве найден данный элемент, он удаляется, и tdelete() возвращает указатель на родительскую вершину. В противном случае возвращается NULL. С этим поведением следует обращаться в своем коде осмотрительно, если вам нужен первоначальный удаляемый элемент, например, для освобождения занимаемой им памяти.

struct employee *е, key; /* Объявления переменных */

void *vp, *root;

/* ...заполнить ключ для удаляемого из дерева элемента... */

vp = tfind(&key, root, emp_name_id_compare); /* Найти удаляемый элемент */

if (vp != NULL) {

 e = *((struct employee**)vp); /* Преобразовать указатель */

 free(e); /* Освободить память */

}

(void)tdelete(&key, &root, emp_name_id_compare); /* Теперь удалить его из дерева */

Хотя это и не указано в справочных страницах или стандарте POSIX, под GNU/Linux, если вы удаляете элемент, хранящийся в корневой вершине, возвращается значение новой корневой вершины. Для переносимого кода не следует полагаться на это поведение

Функция tdestroy() является расширением GLIBC. Она позволяет удалить дерево целиком. Первый аргумент является корнем дерева. Второй является указателем на функцию, которая освобождает данные, на которые указывает каждая вершина дерева. Если с этими данными ничего не надо делать (например, они хранятся в обычном массиве, как в примере нашей программы), эта функция ничего не должна делать. Не передавайте указатель NULL! Это приведет к аварийной ситуации.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

6.3. Влияние семантики и DOM-дерева

Из книги Разгони свой сайт автора Мациевский Николай

6.3. Влияние семантики и DOM-дерева Давайте рассмотрим сейчас другой вопрос, а именно: как быстро браузер создает DOM-дерево в зависимости от наличия в нем элементов с id или class?Для этого мы подготовим 3 набора HTML-файлов. Первый будет содержать 10000 элементов, у которых только


Графики влияния DOM-дерева

Из книги BPwin и Erwin. CASE-средства для разработки информационных систем автора Маклаков Сергей Владимирович

Графики влияния DOM-дерева Ниже приведены разделенные графики по средневзвешенному (естественно, основную роль играет Internet Explorer, ибо сейчас им пользуются от 50% до 70% посетителей наших сайтов) времени создания документа (рис. 6.1) Рис. 6.1. Скорость создания документа,


1.2.5. Диаграммы дерева узлов и FEO

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

1.2.5. Диаграммы дерева узлов и FEO Диаграмма дерева узлов показывает иерархию работ в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между работами (стрелки) (рис. 1.25). Процесс создания модели работ является итерационным, следовательно,


9.3.1. Реализация двоичного дерева

Из книги Моделирование бизнес-процессов с BPwin 4.0 автора Маклаков Сергей Владимирович

9.3.1. Реализация двоичного дерева Ruby позволяет реализовать двоичное дерево разными способами. Например, хранить значения узлов можно в массиве. Но мы применим более традиционный подход, характерный для кодирования на С, только указатели заменим ссылками на объекты.Что


1.2.5. Диаграммы дерева узлов и FEO

Из книги Технология XSLT автора Валиков Алексей Николаевич

1.2.5. Диаграммы дерева узлов и FEO Диаграмма дерева узлов показывает иерархию работ в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между работами (стрелки) (рис. 1.2.23). Процесс создания модели работ является итерационным, следовательно,


Узлы дерева XML-документа

Из книги Программирование на языке Пролог для искусственного интеллекта автора Братко Иван

Узлы дерева XML-документа Корневой узел Корневой узел XML-документа — это узел, который является корнем дерева документа. Не следует путать его с корневым элементом документа, поскольку помимо корневого элемента дочерними узлами корня также являются инструкции по


Создание текстур лакированного дерева

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Создание текстур лакированного дерева В интерьерах кантри преобладают текстуры натурального дерева. Сейчас, на примере текстурирования витой конструкции, о которой говорили ранее, мы рассмотрим порядок создания и применения подобных текстур.1. Откройте сцену из файла


Создание бинарного дерева

Из книги Linux программирование в примерах автора Роббинс Арнольд

Создание бинарного дерева Само по себе создание бинарного дерева тривиально. В простейшем случае корневой узел бинарного дерева определяет все бинарное дерево.varMyBinaryTree : PtBinTreeNode;Если MyBinaryTree равен nil, никакого бинарного дерева не существует, поэтому это значение служит


Удаление из красно-черного дерева

Из книги автора

Удаление из красно-черного дерева По сравнению со вставкой, удаление из красно-черного дерева сопряжено с множеством особых случаев и его может быть трудно отследить.Как обычно, при использовании деревьев бинарного поиска, начнем с поиска узла, который требуется


Удаление из сортирующего дерева

Из книги автора

Удаление из сортирующего дерева Теперь, поскольку мы только что показали, что требуемый элемент расположен в позиции корневого узла, можно приступить к удалению наибольшего узла. Удаление корневого узла и передача этого элемента вызывающей процедуре - не самая лучшая


14.4.5. Обход дерева: twalk()

Из книги автора

14.4.5. Обход дерева: twalk() Функция twalk() объявлена в <search.h> следующим образом:typedef enum { preorder, postorder, endorder, leaf } VISIT;void twalk(const void *root, void (*action)(const void *nodep, const VISIT which,const int depth));Первый параметр является корнем дерева (не указателем на корень). Второй является указателем на функцию