技術積累-1( C技巧/GLib資料結構 )

來源:互聯網
上載者:User

 

// 我承認,下面的內容很大部分是我從網路上找來的

 

1、C 語言中動態建立二維數組

--------------------------

題目要求輸入m和n,然後再定義二維數組a[m][n]

可以這樣做:(以int型為例)

int **a;

int m,n,i;

 

scanf("%d%d",&m,&n);

 

/* malloc函數在stdlib.h裡面,用的時候加入這個標頭檔 */

a=(int**)malloc(m*sizeof(int*));

for(i=0;i<m;i++)

a[i]=(int*)malloc(n*sizeof(int));

 

/* 這樣以後你就可以把a當作二維數組a[m][n]來用了。。 */

 

/* ========================================================================== */

 

2、glib庫資料結構

-----------------

編譯:gcc -o g_array g_array.c `pkg-config --cflags --libs glib-2.0`

 

glib庫裡實現了一些基本的資料結構,比如單向鏈表,雙向鏈表、隊列、樹、Hash表、數組。

 

2.1) glib庫單向鏈表 GSList

typedef struct {

  gpointer data;

  GSList  *next;

} GSList;

 

data 成員定義為gpointer(即void*),可以放任何類型的資料。

next 指向下一個結點

 

2.2) glib庫雙向鏈表 GList

typedef struct {

  gpointer data;

  GList   *next;

  GList   *prev;

} GList;

 

prev 指向上一個結點

 

CODE:

/* 建立 */

GList *list = NULL;

 

/* 向鏈表尾部追加節點 */

    list = g_list_append(list, "one ");

    list = g_list_append(list, "two ");

    list = g_list_append(list, "three ");

    list = g_list_append(list, "four ");

    list = g_list_append(list, "five ");

/* 在鏈表頭部插入 */

    list = g_list_prepend(list, "zero ");

/* 尋找鏈表中的節點 */

    GList *it = NULL;

    it = g_list_find(list, "two ");

    printf("Find data "two ": %s/n", it->data);

/* 確定鏈表指標指向鏈表中的第幾個節點 */

    int index = 0;

    index = g_list_position(list, it);

    printf("index of "two " is: %d/n", index);

    it = g_list_nth(list, 1);

    printf("%s/n", it->data);

/* 從鏈表裡刪除一個節點 */

    list = g_list_remove(list, "three ");

/* 向鏈表裡插入一個節點 */

    list = g_list_insert(list, "INSERT ", 3);

/* 採用內迴圈遍曆鏈表節點 */

    g_list_foreach(list, (GFunc)printf, NULL);

/* 取鏈表的最後一個節點 */

    GList *last = NULL;

    last = g_list_last(list);

/* 從最後一個節點開始遍曆鏈表 */

    for (it = last; it; it = it->prev)

        printf("%s", it->data);

/* 銷毀鏈表 */

    g_list_free(list);

 

自訂內迴圈處理函數:

void print_data(char* data) {

    count++;

    printf("count %d/n data is %s/n",count,data);

}

g_list_foreach(list,print_data,list->data);

 

2.3) glib庫隊列 GQueue

typedef struct {

  GList *head;

  GList *tail;

  guint  length;

} GQueue;

 

head 指向隊列的第一個元素

tail 指向隊列的最後一個元素

length 隊列中元素的個數

 

CODE:

GQueue *queue = NULL;

queue = g_queue_new();

printf("The queue is empty? %s ", g_queue_is_empty(queue) ? "YES" : "NO");

 

    g_queue_push_head(queue, "first ");

    g_queue_push_head(queue, "second ");

    g_queue_push_tail(queue, "one ");

    g_queue_push_tail(queue, "two ");

    g_queue_foreach(queue, (GFunc)printf, NULL);

 

    printf("pop tail of queue: %s ", g_queue_pop_tail(queue));

    printf("pop head of queue: %s /n", g_queue_pop_head(queue));

 

    /* queue index start from 0 */

    printf("pop 2nd of queue: %s /n", g_queue_pop_nth(queue, 1));

 

    g_queue_remove(queue, "second ");

 

    GList *list = NULL;

    list = g_queue_peek_nth_link(queue, 1);

    g_queue_insert_before(queue, list, "10 ");

    g_queue_insert_after(queue, list, "20 ");

 

    g_queue_free(queue);

 

說明:

1、向隊列裡添加和從隊列裡刪除條目不返回任何值,所以為了再次使用隊列要儲存

    g_queue_new()返回的隊列指標。

2、在隊列的兩端、中間都可以插入和刪除條目,這就像排隊的時候有人要插隊,有人沒排到就走了。

3、g_queue_peek_*函數可以取出隊列中條目的內容進行檢查,而不用從隊列中刪除該條目。

 

2.4) glib庫數組 GArray

glib庫中的數組GArray類型很像C++標準容器庫中的vector容器。要使用glib庫中的數組中

需要聲明一個指向GArray類型的指標。

typedef struct {

  gchar *data;

  guint len;

} GArray;

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.