Unix Man (Справочное руководство)

отремонтировать стиральную машину на дому москва недоро... 1001-20.ru

TSEARCH(3C) - часть 2


typedef enum {preorder, postorder, endorder, leaf} VISIT

Значение показывает, который раз (первый, второй или третий) осуществляется доступ к узлу (во время обхода дерева в глубину и слева направо) или показывает, что узел является листом. Третий аргумент - это уровень узла в дереве (в предположении, что корень имеет уровень 0).

Указатели на ключ и корень дерева должны иметь тип "указатель на элемент" и преобразовываться к типу "указатель на символ". Аналогично, возвращаемое значение следует преобразовывать к типу "указатель на элемент", хотя оно и описывается типом "указатель на символ".

ПРИМЕР


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

#include <search.h>

#include <stdio.h>

struct node { /* В дереве будут запоминаться указатели на эти структуры */ char *string; int length; };

char string_space [10000]; /* Пространство для хранения цепочек символов */ struct node nodes [500]; /* Пространство для хранения структур */ struct node *root=NULL; /* Указатель на корень */

main() { char *strptr = string_space; struct node *nodeptr = nodes; void print_node (), twalk (); int i = 0, node_compare ();

while (gets (strptr) != NULL && i++ < 500) {

/* Инициализация структуры */ nodeptr -> string = strptr; nodeptr -> length = strlen(strptr);

/* Поместить структуру в дерево */ (void) tsearch ((char *) nodeptr, (char **)&root, node_compare);

/* Скорректировать указатели */ strptr += nodeptr->length + 1; nodeptr++; } twalk ((char *) root, print_node); }

/* Функция сравнивает две структуры в соответствии с алфавитной упорядоченностью цепочек символов */ int node_compare (node1, node2) char *node1, *node2; { return strcmp (((struct node *) node1)->string, ((struct node *) node2)->string); }




Начало  Назад  Вперед