Linux: Полное руководство
Шрифт:
23.2.4. Списки
Библиотека Glib содержит средства для работы с одно- и двусвязными списками. Особенность двусвязного списка заключается в том, что по нему можно перемещаться в обоих направлениях — назад и вперед. В файле gslist.h (Glib Single List) описаны средства для работы с односвязными списками, а в файле glist.h — для работы с двусвязным списком.
Вот структуры односвязного и двусвязного списков:
Поле data предназначено для хранения данных списка, причем они могут быть любого типа, ведь gpointer — это тип void*.
Работать со списками очень просто. Для начала нужно объявить список:
Затем добавить элементы в список. Это можно сделать с помощью двух функций — g_list_append или g_slist_prepend — в зависимости от используемого типа списка:
Функции g_list_append и g_slist_append добавляют элемент в конец списка. Если вы хотите добавить элемент в начало списка, нужно использовать функции:
Чтобы вставить новый элемент в определенную позицию, нужно использовать функции:
Здесь position — это номер элемента, перед которым нужно вставить новый элемент. Если position=0, то элемент будет добавлен в начало списка, то есть перед бывшим первым элементом.
Для удаления элемента используются функции:
Для передвижения по списку используются функции:
Вот небольшой пример работы со списком — вывод на консоль всех его элементов:
По окончании работы со списком не забудьте освободить память:
Для сортировки списка используется функция:
Первый параметр — это список, который нужно отсортировать. Второй — это функция сравнения двух элементов. Вот ее прототип:
typedef gint (*GCompareFunc) (gconstpointer a, gconstpointer b); Данную функцию вы должны написать самостоятельно. Она должна принимать два параметра и возвращать целое значение:
♦ если a<b, то -1 (точнее, любое число меньше 0);
♦ если a==b, то 0;
♦ если a>b, то 1 (любое число больше 0).
Библиотека Glib также содержит средства для работы с деревьями — как бинарными, так и произвольными, но мы эти средства рассматривать не будем.
23.2.5. Таймеры в Glib
Библиотека Glib позволяет использовать таймеры в наших программах.
Для этого нужно:
♦ подключить заголовочный файл gtimer.h;
♦ создать таймер функцией GTimer *g_timer_new;
♦ запустить таймер функцией g_timer_start(GTimer *timer);
♦ узнать время, отсчитанное таймером — g_timer_elapsed;
♦ при необходимости перезапустить таймер с помощью функции g_timer_reset(GTimer *timer);
♦ остановить таймер функцией g_timer_stop(GTimer * timer);
♦ уничтожить таймер — g_timer_destroy(GTimer *timer).
Стоит остановиться подробнее лишь на функции g_timer_elapsed(GTimer *timer, gulong *mcs). Данная функция возвращает число секунд, отсчитанное таймером. По адресу указателя *mcs записывается число микросекунд.
Пример использования таймера представлен в листинге 23.1.
Листинг 23.1. Использование таймера
Рассвет русского царства. Книга 2
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
рейтинг книги
Стечкин
582. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
рейтинг книги
Чехов. Книга 2
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
рейтинг книги
Кодекс Крови. Книга ХVII
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
рейтинг книги
Первый среди равных. Книга IV
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
рейтинг книги
Лекарь Империи 6
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
рейтинг книги
Я уже барон
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
рейтинг книги
Гиблые земли
Голоса тьмы
Фантастика:
ужасы и мистика
мистика
боевая фантастика
фэнтези
рейтинг книги
Я еще не царь
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
рейтинг книги
Товарищ "Чума" 2
2. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
рейтинг книги
Инженер Петра Великого 2
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
рейтинг книги
Гражданская кампания
12. Сага о Форкосиганах
Фантастика:
космическая фантастика
рейтинг книги