Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

23.2.4. Списки

Библиотека Glib содержит средства для работы с одно- и двусвязными списками. Особенность двусвязного списка заключается в том, что по нему можно перемещаться в обоих направлениях — назад и вперед. В файле gslist.h (Glib Single List) описаны средства для работы с односвязными списками, а в файле glist.h — для работы с двусвязным списком.

Вот структуры односвязного и двусвязного списков:

// односвязный список

typedef struct _GSList GSList;

struct _GSList {

 gpointer data;

 GSList *next; // указатель на следующий элемент списка

};

// двусвязный список

typedef struct _GList GList;

struct _GList {

 gpointer data;

 GList *next; // указатель на следующий элемент списка

 GList *prev; // указатель на предыдущий элемент списка

};

Поле data предназначено для хранения данных списка, причем они могут быть любого типа, ведь gpointer — это тип void*.

Работать со списками очень просто. Для начала нужно объявить список:

GList *list = NULL;

GSList *slist = NULL;

Затем добавить элементы в список. Это можно сделать с помощью двух функций — g_list_append или g_slist_prepend — в зависимости от используемого типа списка:

gchar *el = g_strdup("это первый элемент");

list = g_list_append(list, el);

Функции g_list_append и g_slist_append добавляют элемент в конец списка. Если вы хотите добавить элемент в начало списка, нужно использовать функции:

g_list_prepend(GList *list, gpointer data);

g_slist_prepend{GSList *list, gpointer data);

Чтобы вставить новый элемент в определенную позицию, нужно использовать функции:

GList *g_list_insert(GList *list, gpointer data, gint position);

GSList *g_slist_insert(GSList *list, gpointer data, gint position);

Здесь position — это номер элемента, перед которым нужно вставить новый элемент. Если position=0, то элемент будет добавлен в начало списка, то есть перед бывшим первым элементом.

Для удаления элемента используются функции:

GList *g_list_remove(GList *list, gpointer data);

GSList *g_slist_remove(GSList *list, gpointer data);

Для передвижения по списку используются функции:

g_list_next
,
g_slist_next
— на "шаг" вперед

g_list_prev
— назад

Вот небольшой пример работы со списком — вывод на консоль всех его элементов:

// double_list должен быть определен и содержать элементы

GList *list = double_list;

while (list!=NULL) {

 printf("%s\n",list->data);

 list = g_list_next(list);

}

По окончании работы со списком не забудьте освободить память:

void g_list_free(GList *list);

void g_slist_free(GSList *slist);

Для сортировки списка используется функция:

GSList *g_slist_sort(GSList * slist, GCompareFunc f);

Первый параметр — это список, который нужно отсортировать. Второй — это функция сравнения двух элементов. Вот ее прототип:

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. Использование таймера

#include <stdio.h>

#include <glib.h>

#include <gtimer.h>

int main {

 double sec;

 gulong ms;

 int i;

 GTimer *timer = g_timer_new;

 printf("Данный цикл будет работать не более 10 секунд\n");

Поделиться:
Популярные книги

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Стечкин

Чуев Феликс Иванович
582. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Стечкин

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Кодекс Крови. Книга ХVII

Борзых М.
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Кодекс Крови. Книга ХVII

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Я уже барон

Дрейк Сириус
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже барон

Гиблые земли

Нури Альбина
Голоса тьмы
Фантастика:
ужасы и мистика
мистика
боевая фантастика
фэнтези
5.00
рейтинг книги
Гиблые земли

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Товарищ "Чума" 2

lanpirot
2. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 2

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Гражданская кампания

Буджолд Лоис Макмастер
12. Сага о Форкосиганах
Фантастика:
космическая фантастика
9.14
рейтинг книги
Гражданская кампания

Антон Чехов

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Антон Чехов

Осколки чести

Буджолд Лоис Макмастер
1. Сага о Форкосиганах
Фантастика:
космическая фантастика
9.34
рейтинг книги
Осколки чести