Glib实例学习(6)双端队列
2015-08-16 00:00
781 查看
1:结构
5:小结
创建: g_queue_new()
入队: g_queue_push_head() g_queue_push_tail()
出队: g_queue_pop_head() g_queue_pop_tail()
销毁: g_queue_free()
typedef struct { GList *head; GList *tail; guint length; } GQueue;2:原型
GQueue* g_queue_new (void); void g_queue_free (GQueue *queue); #define G_QUEUE_INIT void g_queue_init (GQueue *queue); void g_queue_clear (GQueue *queue); gboolean g_queue_is_empty (GQueue *queue); guint g_queue_get_length (GQueue *queue); void g_queue_reverse (GQueue *queue); GQueue* g_queue_copy (GQueue *queue); void g_queue_foreach (GQueue *queue, GFunc func, gpointer user_data); GList* g_queue_find (GQueue *queue, gconstpointer data); GList* g_queue_find_custom (GQueue *queue, gconstpointer data, GCompareFunc func); void g_queue_sort (GQueue *queue, GCompareDataFunc compare_func, gpointer user_data); void g_queue_push_head (GQueue *queue, gpointer data); void g_queue_push_tail (GQueue *queue, gpointer data); void g_queue_push_nth (GQueue *queue, gpointer data, gint n); gpointer g_queue_pop_head (GQueue *queue); gpointer g_queue_pop_tail (GQueue *queue); gpointer g_queue_pop_nth (GQueue *queue, guint n); gpointer g_queue_peek_head (GQueue *queue); gpointer g_queue_peek_tail (GQueue *queue); gpointer g_queue_peek_nth (GQueue *queue, guint n); gint g_queue_index (GQueue *queue, gconstpointer data); void g_queue_remove (GQueue *queue, gconstpointer data); void g_queue_remove_all (GQueue *queue, gconstpointer data); void g_queue_insert_before (GQueue *queue, GList *sibling, gpointer data); void g_queue_insert_after (GQueue *queue, GList *sibling, gpointer data); void g_queue_insert_sorted (GQueue *queue, gpointer data, GCompareDataFunc func, gpointer user_data); void g_queue_push_head_link (GQueue *queue, GList *link_); void g_queue_push_tail_link (GQueue *queue, GList *link_); void g_queue_push_nth_link (GQueue *queue, gint n, GList *link_); GList* g_queue_pop_head_link (GQueue *queue); GList* g_queue_pop_tail_link (GQueue *queue); GList* g_queue_pop_nth_link (GQueue *queue, guint n); GList* g_queue_peek_head_link (GQueue *queue); GList* g_queue_peek_tail_link (GQueue *queue); GList* g_queue_peek_nth_link (GQueue *queue, guint n); gint g_queue_link_index (GQueue *queue, GList *link_); void g_queue_unlink (GQueue *queue, GList *link_); void g_queue_delete_link (GQueue *queue, GList *link_);3:实例
#include <stdio.h> #include <glib.h> #include <glib/gprintf.h> struct map { int key; char *value; } m[10] = { {0,"zero"}, {1,"one"}, {2,"two"}, {3,"three"}, {4,"four"}, {5,"five"}, {6,"six"}, {7,"seven"}, {8,"eight"}, {9,"nine"}, }; typedef struct map map; static void myPrintInt(gpointer p1, gpointer fmt) { g_printf(fmt, *(gint *)p1); } static void myPrintStr(gpointer p1, gpointer fmt) { g_printf(fmt, (gchar *)p1); } static void test_queue_1(void) { // GQueue* g_queue_new(void); GQueue *queue = g_queue_new(); // gboolean g_queue_is_empty(GQueue *queue); gboolean b = g_queue_is_empty(queue); g_printf("The queue should be empty now.\t\tResult: %s.\n", b ? "YES" : "NO"); // void g_queue_push_tail(GQueue *queue, gpointer data); gint i; for (i = 0; i < sizeof (m) / sizeof (m[0]); i++) g_queue_push_tail(queue, m[i].value); // void g_queue_foreach(GQueue *queue, GFunc func, gpointer user_data); g_printf("Now the queue[after push tail] :\n"); g_queue_foreach(queue, myPrintStr, "%s, "); g_printf("\n"); // guint g_queue_get_length(GQueue *queue); g_printf("The lenght should be '%d' now.\t\tResult: %d.\n", 10, g_queue_get_length(queue)); // void g_queue_reverse(GQueue *queue); g_queue_reverse(queue); g_printf("Now the queue[after reverse] :\n"); g_queue_foreach(queue, myPrintStr, "%s, "); g_printf("\n"); // gpointer g_queue_pop_head(GQueue *queue); g_printf("The head should be '%s' now.\t\tResult: %s.\n", "nine", (gchar *)g_queue_pop_head(queue)); // gpointer g_queue_pop_tail(GQueue *queue); g_printf("The tail should be '%s' now.\t\tResult: %s.\n", "zero", (gchar *)g_queue_pop_tail(queue)); g_printf("Now the queue[after pop head and tail] :\n"); g_queue_foreach(queue, myPrintStr, "%s, "); g_printf("\n"); // gpointer g_queue_pop_nth(GQueue *queue, guint n); g_printf("The head should be '%s' now.\t\tResult: %s.\n", "eight", (gchar *)g_queue_pop_nth(queue, 0)); // void g_queue_push_head(GQueue *queue, gpointer data); g_queue_push_head(queue, "zero"); g_queue_push_head(queue, "eight"); // void g_queue_push_nth(GQueue *queue, gpointer data, gint n); g_queue_push_nth(queue, "nine", 2); g_printf("Now the queue[after push 'zero' 'eight' 'nine'] :\n"); g_queue_foreach(queue, myPrintStr, "%s, "); g_printf("\n"); // gpointer g_queue_peek_head(GQueue *queue); g_printf("The head should be '%s' now.\t\tResult: %s.\n", "eight", (gchar *)g_queue_peek_head(queue)); // gpointer g_queue_peek_tail(GQueue *queue); g_printf("The tail should be '%s' now.\t\tResult: %s.\n", "zero", (gchar *)g_queue_peek_tail(queue)); // gpointer g_queue_peek_nth(GQueue *queue, guint n); g_printf("The head should be '%s' now.\t\tResult: %s.\n", "eight", (gchar *)g_queue_peek_nth(queue, 0)); /* // void g_queue_clear(GQueue *queue); g_queue_clear(queue); g_printf("Now the queue[after clear] :\n"); g_queue_foreach(queue, myPrintStr, "%s, "); g_printf("\n"); */ // void g_queue_free(GQueue *queue); g_queue_free(queue); } static gint sort(gconstpointer p1, gconstpointer p2, gpointer user_data) { gint32 a, b; a = *(gint*)(p1); b = *(gint*)(p2); return (a > b ? +1 : a == b ? 0 : -1); } static gint myCompareInt(gconstpointer p1, gconstpointer p2) { const int *a = p1; const int *b = p2; return *a - *b; } static gint sort_r(gconstpointer p1, gconstpointer p2, gpointer user_data) { gint32 a, b; a = *(gint*)(p1); b = *(gint*)(p2); return (a < b ? +1 : a == b ? 0 : -1); } static void test_queue_2(void) { GQueue *queue = NULL; /* // void g_queue_init(GQueue *queue); g_queue_init(queue); */ queue = g_queue_new(); // void g_queue_insert_sorted(GQueue *queue, gpointer data, GCompareDataFunc func gpointer user_data); gint i; for (i = 0; i < sizeof (m) / sizeof (m[0]); i++) g_queue_insert_sorted(queue, &m[i].key, sort_r, NULL); g_printf("Now the queue[after insert sorted] :\n"); for (i = 0; i < queue->length; i++) g_printf("%d, ", *(gint *)g_queue_peek_nth(queue, i)); g_printf("\n"); // void g_queue_remove(GQueue *queue, gconstpointer data); g_queue_remove(queue, &m[3].key); g_printf("Now the queue[after remove '%d'] :\n", m[3].key); for (i = 0; i < queue->length; i++) g_printf("%d, ", *(gint *)g_queue_peek_nth(queue, i)); g_printf("\n"); // GList* g_queue_find_custom(GQueue *queue, gconstpointer data, GCompareFunc func); // void g_queue_insert_before(GQueue *queue, GList *sibling, gpointer data); // void g_queue_insert_after(GQueue *queue, GList *sibling, gpointer data); g_queue_insert_before(queue, g_queue_find_custom(queue, &m[5].key, myCompareInt), &m[3].key); g_queue_insert_after(queue, g_queue_find_custom(queue, &m[5].key, myCompareInt), &m[3].key); g_printf("Now the queue[after insert '%d' around '%d'] :\n", m[3].key, m[5].key); g_queue_foreach(queue, myPrintInt, "%d, "); g_printf("\n"); // void g_queue_sort(GQueue *queue, GCompareDataFunc compare, gpointer user_data); g_queue_sort(queue, sort, NULL); g_printf("Now the queue[sorted] :\n"); g_queue_foreach(queue, myPrintInt, "%d, "); g_printf("\n"); // GQueue* g_queue_copy(GQueue *queue); GQueue *q = g_queue_copy(queue); g_printf("Now the queue[copy] :\n"); g_queue_foreach(q, myPrintInt, "%d, "); g_printf("\n"); // void g_queue_remove_all(GQueue *queue, gconstpointer data); g_queue_remove_all(q, &m[3].key); g_printf("Now the queue[remove '%d'] :\n", m[3].key); g_queue_foreach(q, myPrintInt, "%d, "); g_printf("\n"); g_queue_free(q); g_queue_free(queue); } int main(void) { printf("BEGIN:\n************************************************************\n"); printf("\n------------------------------------------------------------\ntest_queue_1:\n"); test_queue_1(); printf("------------------------------------------------------------\n"); printf("\n------------------------------------------------------------\ntest_queue_2:\n"); test_queue_2(); printf("------------------------------------------------------------\n"); printf("\n************************************************************\nDONE\n"); return 0; }4:结果
[xied1@soho use]$ gcc `pkg-config --cflags --libs glib-2.0` -Wall -O2 -o queue queue.c [xied1@soho use]$ ./queue BEGIN: ************************************************************ ------------------------------------------------------------ test_queue_1: The queue should be empty now. Result: YES. Now the queue[after push tail] : zero, one, two, three, four, five, six, seven, eight, nine, The lenght should be '10' now. Result: 10. Now the queue[after reverse] : nine, eight, seven, six, five, four, three, two, one, zero, The head should be 'nine' now. Result: nine. The tail should be 'zero' now. Result: zero. Now the queue[after pop head and tail] : eight, seven, six, five, four, three, two, one, The head should be 'eight' now. Result: eight. Now the queue[after push 'zero' 'eight' 'nine'] : eight, zero, nine, seven, six, five, four, three, two, one, The head should be 'eight' now. Result: eight. The tail should be 'zero' now. Result: one. The head should be 'eight' now. Result: eight. ------------------------------------------------------------ ------------------------------------------------------------ test_queue_2: Now the queue[after insert sorted] : 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, Now the queue[after remove '3'] : 9, 8, 7, 6, 5, 4, 2, 1, 0, Now the queue[after insert '3' around '5'] : 9, 8, 7, 6, 3, 5, 3, 4, 2, 1, 0, Now the queue[sorted] : 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, Now the queue[copy] : 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, Now the queue[remove '3'] : 0, 1, 2, 4, 5, 6, 7, 8, 9, ------------------------------------------------------------ ************************************************************ DONE
5:小结
创建: g_queue_new()
入队: g_queue_push_head() g_queue_push_tail()
出队: g_queue_pop_head() g_queue_pop_tail()
销毁: g_queue_free()
相关文章推荐
- Glib实例学习(7)关系/元组
- Glib实例学习(8)系列一(完)
- 吉他 c大调第一把位
- 15个必须知道的 Chrome 开发技巧
- eclipse控制台不显示打印信息的处理方法
- JsonUtil-本人原创
- Web客户端安全性最佳实践
- Perl 中的输入与输出
- getResource的用法对于class和classloader
- rpm与srpm包的区别和安装方法
- 空中网面试题二SynchronousQueue
- SDK学院--棱镜SDK:棱镜SDK 二次验证方案
- php友好格式化时间
- Linux学习笔记(23) Linux备份
- Mini-project # 3 - "Stopwatch: The Game"
- Android 登录界面的实现
- 克隆 CentOS 后系统启动问题解析
- [LeetCode][JavaScript]Max Points on a Line
- javascript中的call方法和apply方法
- Eclipse启动出现的两个与JDK问题相关的解决办法