Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Следующая программа,
ch14-tsearch.cstruct employeeemp_name_id_compare()1 /* ch14-tsearch.c --- демонстрация управления деревом */23 #include <stdio.h>4 #include <search.h>5 #include <time.h>67 struct employee {8 char lastname[30];9 char firstname[30];10 long emp_id;11 time_t start_date;12 };1314 /* emp_name_id_compare --- сравнение по имени, затем no ID */1516 int emp_name_id_compare(const void *e1p, const void *e2p)17 {18 const struct employee *e1, *e2;19 int last, first;2021 e1 = (const struct employee*)e1p;22 e2 = (const struct employee*)e2p;2324 if ((last = strcmp(e1->lastname, e2->lastname)) != 0)25 return last;2627 /* фамилии совпадают, проверить имена */28 if ((first = strcmp(e1->firstname, e2->firstname)) != 0)29 return first;3031 /* имена совпадают, проверить ID */32 if (e1->emp_id < e2->emp_id)33 return -1;34 else if (e1->emp_id == e2->emp_id)35 return 0;36 else37 return 1;38 }3940 /* print_emp --- вывод структуры employee во время обхода дерева */4142 void print_emp(const void *nodep, const VISIT which, const int depth)43 {44 struct employee *e = *((struct employee**)nodep);4546 switch (which) {47 case leaf:48 case postorder:49 printf("Depth: %d. Employee: n", depth);50 printf("t%s, %st%dt%sn", e->lastname, e->firstname,51 e->emp_id, ctime(&e->start_date));52 break;53 default:54 break;55 }56 }Строки 7–12 определяют
struct employeeemp_name_id_compare()Строки 40–56 определяют
print_emp()struct employee58 /* main --- демонстрация хранения данных в двоичном дереве */5960 int main(void)61 {62 #define NPRES 1063 struct employee presidents[NPRES];64 int i, npres;65 char buf[BUFSIZ];66 void *root = NULL;6768 /* Очень простой код для чтения данных: */69 for (npres = 0; npres < NPRES && fgets(buf, BUFSIZ, stdin) != NULL;70 npres++) {71 sscanf(buf, "%s %s %ld %ldn",72 presidents[npres].lastname,73 presidents[npres].firstname,74 &presidents[npres].emp_id,75 &presidents[npres].start_date);76 }7778 for (i = 0; i < npres; i++)79 (void)tsearch(&presidents[i], &root, emp_name_id_compare);8081 twalk(root, print_emp);82 return 0;83 }Целью вывода дерева является вывод содержащихся в нем элементов в отсортированном порядке. Помните, что
twalk()switchwhichleafpostorderИспользуемые данные представляют собой список президентов, тоже из раздела 6.2 «Функции сортировки и поиска». Чтобы освежить вашу память, полями являются фамилия, имя, номер сотрудника и время начала работы в виде временной отметки в секундах с начала Эпохи:
$ <b>cat presdata.txt</b>Bush George 43 980013600