Glib实例学习(6)双端队列

1:结构


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()


转载于:https://my.oschina.net/iamhere/blog/493150

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值