// 我承認,下面的內容很大部分是我從網路上找來的
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;