Книга: Linux программирование в примерах
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
! Это приведет к аварийной ситуации.
- 14.4.1. Введение в двоичные деревья
- 14.4.2. Функции управления деревьями
- 14.4.3. Ввод элемента в дерево: tsearch()
- 14.4.4. Поиск по дереву и использование возвращенного указателя: tfind() и tsearch()
- 14.4.5. Обход дерева: twalk()
- 14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()
- Обход дерева
- Удаление шаблонов узлов STP
- Удаление учебного узла
- Удаление файлов занятий
- Удаление узла
- Добавление, изменение и удаление элементов списка
- Добавление, изменение и удаление столбцов списка
- Удаление списка
- Удаление документов
- Удаление библиотеки
- Удаление рабочей области для документов
- Удалил программу, а в компоненте Установка и удаление программ она осталась. Как ее удалить и оттуда?