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! Это приведет к аварийной ситуации.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
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));Первый параметр является корнем дерева (не указателем на корень). Второй является указателем на функцию
6.3. Влияние семантики и DOM-дерева
6.3. Влияние семантики и DOM-дерева Давайте рассмотрим сейчас другой вопрос, а именно: как быстро браузер создает DOM-дерево в зависимости от наличия в нем элементов с id или class?Для этого мы подготовим 3 набора HTML-файлов. Первый будет содержать 10000 элементов, у которых только
Графики влияния DOM-дерева
Графики влияния DOM-дерева Ниже приведены разделенные графики по средневзвешенному (естественно, основную роль играет Internet Explorer, ибо сейчас им пользуются от 50% до 70% посетителей наших сайтов) времени создания документа (рис. 6.1) Рис. 6.1. Скорость создания документа,
9.3.1. Реализация двоичного дерева
9.3.1. Реализация двоичного дерева Ruby позволяет реализовать двоичное дерево разными способами. Например, хранить значения узлов можно в массиве. Но мы применим более традиционный подход, характерный для кодирования на С, только указатели заменим ссылками на объекты.Что
Создание бинарного дерева
Создание бинарного дерева Само по себе создание бинарного дерева тривиально. В простейшем случае корневой узел бинарного дерева определяет все бинарное дерево.varMyBinaryTree : PtBinTreeNode;Если MyBinaryTree равен nil, никакого бинарного дерева не существует, поэтому это значение служит
Удаление из красно-черного дерева
Удаление из красно-черного дерева По сравнению со вставкой, удаление из красно-черного дерева сопряжено с множеством особых случаев и его может быть трудно отследить.Как обычно, при использовании деревьев бинарного поиска, начнем с поиска узла, который требуется
Удаление из сортирующего дерева
Удаление из сортирующего дерева Теперь, поскольку мы только что показали, что требуемый элемент расположен в позиции корневого узла, можно приступить к удалению наибольшего узла. Удаление корневого узла и передача этого элемента вызывающей процедуре - не самая лучшая
1.2.5. Диаграммы дерева узлов и FEO
1.2.5. Диаграммы дерева узлов и FEO Диаграмма дерева узлов показывает иерархию работ в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между работами (стрелки) (рис. 1.2.23). Процесс создания модели работ является итерационным, следовательно,
Создание текстур лакированного дерева
Создание текстур лакированного дерева В интерьерах кантри преобладают текстуры натурального дерева. Сейчас, на примере текстурирования витой конструкции, о которой говорили ранее, мы рассмотрим порядок создания и применения подобных текстур.1. Откройте сцену из файла
1.2.5. Диаграммы дерева узлов и FEO
1.2.5. Диаграммы дерева узлов и FEO Диаграмма дерева узлов показывает иерархию работ в модели и позволяет рассмотреть всю модель целиком, но не показывает взаимосвязи между работами (стрелки) (рис. 1.25). Процесс создания модели работ является итерационным, следовательно,
Узлы дерева XML-документа
Узлы дерева XML-документа Корневой узел Корневой узел XML-документа — это узел, который является корнем дерева документа. Не следует путать его с корневым элементом документа, поскольку помимо корневого элемента дочерними узлами корня также являются инструкции по