Glib實例學習(1)單鏈表

1:SList結構php

 

  
  
  
  
  1. typedef struct _GSList GSList;  
  2.  
  3. struct _GSList  
  4. {  
  5. gpointer data;  
  6. GSList *next;  
  7. }; 
2: SList 原型
  
  
  
  
  1. GSList* g_slist_append (GSList *list,  
  2.                                           gpointer data) G_GNUC_WARN_UNUSED_RESULT;  
  3. GSList* g_slist_prepend (GSList *list,  
  4.                                           gpointer data) G_GNUC_WARN_UNUSED_RESULT;  
  5. GSList* g_slist_insert (GSList *list,  
  6.                                           gpointer data,  
  7.                                           gint position) G_GNUC_WARN_UNUSED_RESULT;  
  8. GSList* g_slist_insert_sorted (GSList *list,  
  9.                                           gpointer data,  
  10.                                           GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT;  
  11. GSList* g_slist_insert_sorted_with_data (GSList *list,  
  12.                                           gpointer data,  
  13.                                           GCompareDataFunc func,  
  14.                                           gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;  
  15. GSList* g_slist_insert_before (GSList *slist,  
  16.                                           GSList *sibling,  
  17.                                           gpointer data) G_GNUC_WARN_UNUSED_RESULT;  
  18. GSList* g_slist_concat (GSList *list1,  
  19.                                           GSList *list2) G_GNUC_WARN_UNUSED_RESULT;  
  20. GSList* g_slist_remove (GSList *list,  
  21.                                           gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;  
  22. GSList* g_slist_remove_all (GSList *list,  
  23.                                           gconstpointer data) G_GNUC_WARN_UNUSED_RESULT;  
  24. GSList* g_slist_remove_link (GSList *list,  
  25.                                           GSList *link_) G_GNUC_WARN_UNUSED_RESULT;  
  26. GSList* g_slist_delete_link (GSList *list,  
  27.                                           GSList *link_) G_GNUC_WARN_UNUSED_RESULT;  
  28. GSList* g_slist_reverse (GSList *list) G_GNUC_WARN_UNUSED_RESULT;  
  29. GSList* g_slist_copy (GSList *list) G_GNUC_WARN_UNUSED_RESULT;  
  30. GSList* g_slist_nth (GSList *list,  
  31.                                           guint n);  
  32. GSList* g_slist_find (GSList *list,  
  33.                                           gconstpointer data);  
  34. GSList* g_slist_find_custom (GSList *list,  
  35.                                           gconstpointer data,  
  36.                                           GCompareFunc func);  
  37. gint g_slist_position (GSList *list,  
  38.                                           GSList *llink);  
  39. gint g_slist_index (GSList *list,  
  40.                                           gconstpointer data);  
  41. GSList* g_slist_last (GSList *list);  
  42. guint g_slist_length (GSList *list);  
  43. void g_slist_foreach (GSList *list,  
  44.                                           GFunc func,  
  45.                                           gpointer user_data);  
  46. GSList* g_slist_sort (GSList *list,  
  47.                                           GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT;  
  48. GSList* g_slist_sort_with_data (GSList *list,  
  49.                                           GCompareDataFunc compare_func,  
  50.                                           gpointer user_data) G_GNUC_WARN_UNUSED_RESULT;  
  51. gpointer g_slist_nth_data (GSList *list,  
  52.                                           guint n); 
3:SList 實例
  
  
  
  
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <time.h>  
  4. #include <glib.h>  
  5. #include <glib/gprintf.h>  
  6.  
  7. /*  
  8.  * g_slist_append  
  9.  * g_slist_prepend  
  10.  * g_slist_reverse  
  11.  */ 
  12. static void 
  13. test_slist_1(void)  
  14. {  
  15.     GSList *slist = NULL;  
  16.     GSList *st;  
  17.     gint nums[10] = {0,1,2,3,4,5,6,7,8,9};  
  18.     gint i;  
  19.  
  20.     for (i = 0; i < 10; i++)  
  21. // GSList* g_slist_append(GSList *list, gpointer data);  
  22.         slist = g_slist_append(slist, &nums[i]);  
  23.       
  24.     g_printf("The result should be: 0,1,2,3,4,5,6,7,8,9\n");  
  25.     g_printf("Begin:\n");  
  26.     for (i = 0; i < 10; i++) {  
  27.         st = g_slist_nth(slist, i);  
  28.         g_printf("%d,", *(gint*)st->data);  
  29.     }  
  30.     g_printf("\nDone\n");  
  31.  
  32. // GSList* g_slist_reverse(GSList *list);  
  33.     slist = g_slist_reverse(slist);  
  34.  
  35.     g_printf("The result should be: 9,8,7,6,5,4,3,2,1,0\n");  
  36.     g_printf("Begin:\n");  
  37.     for (i = 0; i < 10; i++) {  
  38.         st = g_slist_nth(slist, i);  
  39.         g_printf("%d,", *(gint*)st->data);  
  40.     }  
  41.     g_printf("\nDone\n");  
  42.  
  43.     for (i = 0; i < 10; i++)  
  44. // GSList* g_slist_prepend(GSList *list, gpointer data);  
  45.         slist = g_slist_prepend(slist, &nums[i]);  
  46.  
  47.     g_printf("The result should be: 9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0\n");  
  48.     g_printf("Begin:\n");  
  49.     for (i = 0; i < 20; i++) {  
  50.         st = g_slist_nth(slist, i);  
  51.         g_printf("%d,", *(gint*)st->data);  
  52.     }  
  53.     g_printf("\nDone\n");  
  54.  
  55.     g_slist_free(slist);  
  56. }  
  57.  
  58. /*  
  59.  * g_slist_insert_before  
  60.  * g_slist_insert  
  61.  * g_slist_nth  
  62.  * g_slist_copy  
  63.  */ 
  64. static void 
  65. test_slist_2(void)  
  66. {  
  67.     GSList *slist = NULL;  
  68.     GSList *st;  
  69.     GSList *st2;  
  70.     gint nums[10] = {0,1,2,3,4,5,6,7,8,9};  
  71.     gint i;  
  72. // GSList* g_slist_insert_before(GSList *slist, GSList *sibling, gpointer data);  
  73.     slist = g_slist_insert_before(NULL, NULL, &nums[1]);  
  74.  
  75. // GSList* g_slist_insert(GSList *list, gpointer data, gint position);  
  76.     slist = g_slist_insert(slist, &nums[3], 1);  
  77.     slist = g_slist_insert(slist, &nums[4], -1);  
  78.     slist = g_slist_insert(slist, &nums[0], 0);  
  79.     slist = g_slist_insert(slist, &nums[5], 100);  
  80.     slist = g_slist_insert_before(slist, NULL, &nums[6]);  
  81.     slist = g_slist_insert_before(slist, slist->next->next, &nums[2]);  
  82.  
  83.     slist = g_slist_insert(slist, &nums[9], 7);  
  84.     slist = g_slist_insert(slist, &nums[8], 7);  
  85.     slist = g_slist_insert(slist, &nums[7], 7);  
  86.  
  87.     g_printf("The result should be: 0,1,2,3,4,5,6,7,8,9\n");  
  88.     g_printf("Begin:\n");  
  89.     for (i = 0; i < 10; i++) {  
  90. // GSList* g_slist_nth(GSList *list, guint n);  
  91.         st = g_slist_nth(slist, i);  
  92.         g_printf("%d,", *(gint*)st->data);  
  93.     }  
  94.     g_printf("\nDone\n");  
  95.  
  96. // GSList* g_slist_copy(GSList *list);  
  97.     st = g_slist_copy(slist);  
  98.     g_printf("The result should be: 0,1,2,3,4,5,6,7,8,9\n");  
  99.     g_printf("Begin:\n");  
  100.     for (i = 0; i < 10; i++) {  
  101.         st2 = g_slist_nth(st, i);  
  102.         g_printf("%d,", *(gint*)st2->data);  
  103.     }  
  104.     g_printf("\nDone\n");  
  105.  
  106.     g_slist_free(st);  
  107.     g_slist_free(slist);  
  108. }  
  109.  
  110. /*  
  111.  * g_slist_lenth  
  112.  * g_slist_remove  
  113.  * g_slist_remove_all  
  114.  * g_slist_last  
  115.  * g_slist_next  
  116.  */ 
  117. static void 
  118. test_slist_3(void)  
  119. {  
  120.     GSList *slist = NULL;  
  121.     GSList *st;  
  122.     gint nums[10] = {0,1,2,3,4,5,6,7,8,9};  
  123.     gint i;  
  124.  
  125.     for (i = 0; i < 10; i++) {  
  126.         slist = g_slist_append(slist, &nums[i]);  
  127.         slist = g_slist_append(slist, &nums[i]);  
  128.     }  
  129. // guint g_slist_lenth(GSList *list);  
  130.     g_printf("The length should be 20.\nResult:%d\n", g_slist_length(slist));  
  131.  
  132.     for (i = 0; i < 10; i++)  
  133. // GSList* g_slist_remove_all(GSList *list, gconstpointer data);  
  134.         slist = g_slist_remove_all(slist, &nums[i]);  
  135.     g_printf("The length should be 0.\nResult:%d\n", g_slist_length(slist));  
  136.  
  137.     for (i = 0; i < 10; i++) {  
  138.         slist = g_slist_append(slist, &nums[i]);  
  139.         slist = g_slist_append(slist, &nums[i]);  
  140.     }  
  141.     for (i = 0; i < 10; i++)  
  142. // GSList* g_slist_remove(GSList *list, gconstpointer data);  
  143.         slist = g_slist_remove(slist, &nums[i]);  
  144.     g_printf("The length should be 10.\nResult:%d\n", g_slist_length(slist));  
  145.     g_printf("The first should be 0.\nResult:%d\n", *(gint*)slist->data);  
  146. // GSList* g_slist_last(GSList *list);  
  147.     g_printf("The last should be 9.\nResult:%d\n", *(gint*)g_slist_last(slist)->data);  
  148.  
  149.     g_printf("The first:");  
  150.     g_printf("%d\n", *(gint*)slist->data);      
  151.     st = slist;  
  152.     for (i = 0; i < 9; i++) {  
  153. // #define g_slist_next (slist)  
  154.         st = g_slist_next(st);      
  155.         g_printf("The next:%d\n", *(gint*)st->data);  
  156.     }  
  157.  
  158.     g_slist_free(slist);  
  159. }  
  160.  
  161. static gint  
  162. find_num(gconstpointer l, gconstpointer data)  
  163. {  
  164.     return *(gint*)l - GPOINTER_TO_INT(data);  
  165. }  
  166.  
  167. /*  
  168.  * g_slist_index  
  169.  * g_slist_position  
  170.  * g_slist_find_custom  
  171.  */ 
  172. static void 
  173. test_slist_4(void)  
  174. {  
  175.     GSList *slist = NULL;  
  176.     GSList *st;  
  177.     gint nums[10] = {0,1,2,3,4,5,6,7,8,9};  
  178.     gint i;  
  179.  
  180.     for (i = 0; i < 10; i++) {  
  181.         slist = g_slist_append(slist, &nums[i]);  
  182.     }  
  183. // gint g_slist_index(GSList *list, gconstpointer data);  
  184.     g_printf("The index should be -1.\nResult:%d\n", g_slist_index(slist, NULL));  
  185. // gint g_slist_position(GSList *list, GSList *llink);  
  186.     g_printf("The position should be -1.\nResult:%d\n", g_slist_position(slist, NULL));  
  187.  
  188.     for (i = 0; i < 10; i++) {  
  189. // GSList* g_slist_find_custom(GSList *list, gconstpointer data, GCompareFunc func);  
  190.         st = g_slist_find_custom(slist, GINT_TO_POINTER(i), find_num);  
  191.         g_printf("The position should be %d.\nResult:%d\n", i, g_slist_position(slist, st));  
  192.     }  
  193.  
  194.     g_slist_free(slist);  
  195. }  
  196.  
  197. #define SIZE        10  
  198. #define NUMBER_MAX    99  
  199.  
  200. static guint32 array[SIZE];  
  201.  
  202. static gint  
  203. sort(gconstpointer p1, gconstpointer p2)  
  204. {  
  205.     gint32 a, b;  
  206.     a = GPOINTER_TO_INT (p1);  
  207.     b = GPOINTER_TO_INT (p2);  
  208.  
  209.     return (a > b ? +1 : a == b ? 0 : -1);  
  210. }  
  211.  
  212. static gint  
  213. sort_r(gconstpointer p1, gconstpointer p2)  
  214. {  
  215.     gint32 a, b;  
  216.     a = GPOINTER_TO_INT (p1);  
  217.     b = GPOINTER_TO_INT (p2);  
  218.  
  219.     return (a < b ? +1 : a == b ? 0 : -1);  
  220. }  
  221.  
  222. /*  
  223.  * g_slist_sort  
  224.  * g_slist_sort_with_data  
  225.  * g_slist_nth_data  
  226.  */ 
  227. static void 
  228. test_slist_5(void)  
  229. {  
  230.     GSList *slist = NULL;  
  231.     gint i;  
  232.  
  233.     for (i = 0; i < SIZE; i++)  
  234.         slist = g_slist_append(slist, GINT_TO_POINTER(array[i]));  
  235.  
  236. // GSList* g_slist_sort(GSList *list, GCompareFunc compare);  
  237.     slist = g_slist_sort(slist, sort);  
  238.  
  239.     g_printf("The result should be sorted.\nResult:");  
  240.     for (i = 0; i < SIZE; i++) {  
  241. // gpointer g_slist_nth_data(GSList *list, guint n);  
  242.         gpointer p = g_slist_nth_data(slist, i);  
  243.         g_printf("%d,", GPOINTER_TO_INT(p));  
  244.     }  
  245.     g_printf("\n");  
  246.  
  247. // GSList* g_slist_sort_with_data(GSList *list, GCompareDataFunc compare_func, gpinter user_data);  
  248.     slist = g_slist_sort_with_data(slist, (GCompareDataFunc)sort_r, NULL);  
  249.     g_printf("The result should be sorted[reversed].\nResult:");  
  250.     for (i = 0; i < SIZE; i++) {  
  251.         gpointer p = g_slist_nth_data(slist, i);  
  252.         g_printf("%d,", GPOINTER_TO_INT(p));  
  253.     }  
  254.     g_printf("\n");  
  255.  
  256.     g_slist_free(slist);  
  257. }  
  258.  
  259. static void 
  260. print(gpointer p1, gpointer p2)  
  261. {  
  262.     g_printf("%d,", GPOINTER_TO_INT(p1));  
  263. }  
  264.  
  265. /*  
  266.  * g_slist_insert_sorted  
  267.  * g_slist_insert_sorted_with_data  
  268.  * g_slist_concat  
  269.  * g_slist_foreach  
  270.  */ 
  271. static void 
  272. test_slist_6(void)  
  273. {  
  274.     GSList *slist = NULL;  
  275.     GSList *st = NULL;  
  276.     GSList *sc = NULL;  
  277.     gint i;  
  278.  
  279.     for (i = 0; i < SIZE; i++) {  
  280. // GSList* g_slist_insert_sorted(GSList *list, gpointer data, GCompareFunc func);  
  281.         slist = g_slist_insert_sorted(slist, GINT_TO_POINTER(array[i]), sort);  
  282. // GSList* g_slist_insert_sorted_with_data(GSList *list, gpointer data,   
  283. //                            GCompareDataFunc func,  
  284. //                            gpinter user_data);  
  285.         st = g_slist_insert_sorted_with_data(st, GINT_TO_POINTER(array[i]),   
  286.                             (GCompareDataFunc)sort_r,  
  287.                             NULL);  
  288.     }  
  289.       
  290.     g_printf("The result should be sorted.\nResult:");  
  291.     for (i = 0; i < SIZE; i++) {  
  292.         gpointer p = g_slist_nth_data(slist, i);  
  293.         g_printf("%d,", GPOINTER_TO_INT(p));  
  294.     }  
  295.     g_printf("\n");  
  296.  
  297.     g_printf("The result should be sorted[reversed].\nResult:");  
  298.     for (i = 0; i < SIZE; i++) {  
  299.         gpointer p = g_slist_nth_data(st, i);  
  300.         g_printf("%d,", GPOINTER_TO_INT(p));  
  301.     }  
  302.     g_printf("\n");  
  303.  
  304. // GSList* g_slist_concat(GSList *list1, *list2);  
  305.     sc = g_slist_concat(slist, st);  
  306.  
  307.     g_printf("The result should be concated.\nResult:");  
  308. // void g_slist_foreach(GSList *list, GFunc func, gpointer user_data);  
  309.     g_slist_foreach(sc, (GFunc)print, NULL);  
  310.     g_printf("\n");  
  311.       
  312.     g_slist_free(slist);  
  313.     g_slist_free(st);  
  314.  
  315. }  
  316.  
  317. int 
  318. main(void)  
  319. {  
  320.     printf("BEGIN:\n************************************************************\n");  
  321.     printf("\n------------------------------------------------------------\ntest_slist_1:\n");  
  322.     printf("------------------------------------------------------------\n");  
  323.     test_slist_1();  
  324.     printf("\n------------------------------------------------------------\ntest_slist_2:\n");  
  325.     printf("------------------------------------------------------------\n");  
  326.     test_slist_2();  
  327.     printf("\n------------------------------------------------------------\ntest_slist_3:\n");  
  328.     printf("------------------------------------------------------------\n");  
  329.     test_slist_3();  
  330.     printf("\n------------------------------------------------------------\ntest_slist_4:\n");  
  331.     printf("------------------------------------------------------------\n");  
  332.     test_slist_4();  
  333.  
  334.     int i;  
  335.     srand((unsigned)time(0));  
  336.     printf("The init array is:\n");  
  337.     for (i = 0; i < SIZE; i++) {  
  338.         array[i] = rand() % (NUMBER_MAX+1);  
  339.         printf("%d,", array[i]);  
  340.     }  
  341.     printf("\n");  
  342.  
  343.     printf("\n------------------------------------------------------------\ntest_slist_5:\n");  
  344.     printf("------------------------------------------------------------\n");  
  345.     test_slist_5();  
  346.  
  347.     printf("\n------------------------------------------------------------\ntest_slist_6:\n");  
  348.     printf("------------------------------------------------------------\n");  
  349.     test_slist_6();  
  350.  
  351.     printf("\n************************************************************\nDONE\n");  
  352.  
  353.     return 0;  
轉載自:http://blog.chinaunix.net/space.php?uid=25696269&do=blog&id=483448
相關文章
相關標籤/搜索