Книга: Linux программирование в примерах
14.4.3. Ввод элемента в дерево: tsearch()
14.4.3. Ввод элемента в дерево: tsearch()
Эти процедуры выделяют память для вершин дерева. Для их использования с несколькими деревьями нужно предоставить им указатель на переменную void*
, в которую они заносят адрес корневой вершины. При создании нового дерева инициализируйте этот указатель в NULL
:
void *root = NULL; /* Корень нового дерева */
void *val; /* Указатель на возвращенные данные */
extern int my_compare(const void*, const void*); /* Функция сравнения */
extern char key[], key2[]; /* Значения для ввода в дерево */
val = tsearch(key, &root, my_compare);
/* Ввести в дерево первый элемент */
/* ...заполнить key2 другим значением. НЕ изменять корень... */
val = tsearch(key2, &root, my_compare);
/* Ввести в дерево последующий элемент */
Как показано, в переменной root
должен быть NULL
лишь в первый раз, после чего нужно оставить ее как есть. При каждом последующем вызове tsearch()
использует ее для управления деревом.
Когда разыскиваемый key
найден, как tsearch()
, так и tfind()
возвращают указатель на содержащую его вершину. Поведение функций различно, когда key
не найден: tfind()
возвращает NULL
, a tsearch()
вводит в дерево новое значение и возвращает указатель на него. Функции tsearch()
и tfind()
возвращают указатели на внутренние вершины дерева. Они могут использоваться в последующих вызовах в качестве значения root для работы с поддеревьями. Как мы вскоре увидим, значение key может быть указателем на произвольную структуру; он не ограничен символьной строкой, как можно было бы предположить из предыдущего примера.
Эти процедуры сохраняют лишь указатели на данные, использующиеся в качестве ключей. Соответственно это ваше дело управлять памятью для хранения значений данных, обычно с помощью malloc()
.
ЗАМЕЧАНИЕ. Поскольку функции деревьев хранят указатели, тщательно позаботьтесь о том, чтобы не использовать realloc()
для значений, которые были использованы в качестве ключей! realloc()
может переместить данные, вернув новый указатель, но процедуры деревьев все равно сохранят висящие (dangling) указатели на старые данные.
- 14.4.1. Введение в двоичные деревья
- 14.4.2. Функции управления деревьями
- 14.4.3. Ввод элемента в дерево: tsearch()
- 14.4.4. Поиск по дереву и использование возвращенного указателя: tfind() и tsearch()
- 14.4.5. Обход дерева: twalk()
- 14.4.6. Удаление вершины дерева и удаление дерева: tdelete() и tdestroy()
- Письма с элементами графики и вложениями
- 1.6 Драйверы и буферы ввода-вывода
- 1.8 Ввод-вывод типичного приложения хранения данных
- Глава 6 BIOS – базовая система ввода-вывода
- 5.2.2.2. Устройства ввода информации в персональный компьютер
- Дерево покупательских решений
- Можно ли входить в систему без ввода имени и пароля?
- 13.3.1. Пакетный ввод
- Выбор элемента с помощью переключателя
- Создание документов и ввод текста
- Ввод и форматирование текста в таблице
- Ввод данных в ячейки