技術積累 1 C技巧 GLib資料結構

2021-09-30 07:48:55 字數 2960 閱讀 5964

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

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;ia[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 gslist;

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

next 指向下乙個結點

2.2) glib庫雙向鍊錶 glist

typedef struct glist;

prev 指向上乙個結點

code:

/* 建立 */

glist *list = null;

/* 向鍊錶尾部追加節點 */

/* 在鍊錶頭部插入 */

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) 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 garray;

1 C 資料型別(tcy)

資料型別 2019 1 31 1.資料型別 1 預定義型別 bool,char,byte1,short2,int4,long8,long long整型 64 float4,double8,指標型,void無值型 用於指標,函式 2 型別修飾符 signed,unsigned,short,long用於...

資料型別1 C語言學習筆記3

1 有些資料型別在程式使用之前已經預先設定好了,在整個程式的執行過程中沒有變化,這些稱為常量 constant 其他資料型別在程式執行期間可能會改變或被賦值,這些稱為變數 variable 2 c語言通過識別一些基本的資料型別來區分和使用這些不同的資料型別。如果資料是常量,編譯器一般通過使用者使用者...

C 基礎1 C 中的資料型別和操作符

本文主要講解了c 的內建資料型別 內建資料型別的字面值 列舉型別和聯合型別,位操作符。一 資料型別 1.c 的基本內建資料型別有char wchar t int short long long long float double bool long double,其中,int short long ...