GListの機能を説明しています。
リストにはシングルリスト(GSList) と ダブルリスト(GList)がありますが、
大抵GList しか使いません。ほとんど同じなのでGList で説明しています。
特徴
GList 構造体はリスト全体のポインタではなく、1つのノードへのポインタに過ぎない。
実際にはリスト内の各ノードがGList 構造体になる。
各構造体には3つのポインタがある。
"data" ノードに保管されているデータへのgpointer
"next" 次のノードへのポインタ
"prev" 直前のノードへのポインタ GSList には当然ない。
GListの実際の使い方
例1
GList *list = NULL;
NULLで初期化する
list = g_list_append(list ,"なっち");
リストの最後に追加する
list = g_list_prepend(list ,"ごっちん");
リストの最初に追加する
g_print("%s\n",(gchar *)list->data);
リストのデータを表示させる。
g_list_append / prepend で帰ってくるGList は最初のノードへのポインタ。
この場合、ごっちんが表示される。
例2
GList *list = NULL;
list = g_list_append(list ,"なっち");
list = g_list_append(list ,"よっすぃー");
list = g_list_append(list ,"辻");
list = g_list_append(list ,"加護");
list = g_list_append(list ,"後藤");
list = g_list_append(list ,"石川");
list = g_list_append(list ,"矢口");
list = g_list_append(list ,"飯田");
list = g_list_append(list ,"安田");
gint g_list_length( GList *list );
ノ ード数を返す。 9が返る。
GList *g_list_first( GList *list );
最初のノードへのポインタを返す。なっちノードへのポインタ。
GList *g_list_last( GList *list );
最後のノードへのポインタを返す。安田ノードへのポインタ。
GList *g_list_nth( GList *list, gint
n );
引数n に対応するノードへのポインタを返す。
g_list_nth(list ,4); なら 後藤ノードへのポインタ。
0から数える点に注意。
GList *g_list_find( GList
*list, gpointer data );
dataに対応するノードへのポインタを返す。
g_list_find(list ,"矢口"); なら 矢口ノードへのポインタ。
GList *g_list_reverse( GList *list );
リストの順番を逆にする。
安田、飯田、矢口、石川、加護、辻、よっすぃー、なっちの順番になる。
void g_list_foreach( GList
*list,GFunc func, gpointer user_data );
ノードの数だけfunc関数を呼び出す。
void
show_data(gpointer data ,gpointer user_data)
{
gchar *message;
message = (gchar *)data;
g_print("%s ",message);
}
という関数があって、g_list_foreach(glist ,(GFunc)show_data ,NULL);とあると、
なっち よっすぃー 辻 加護 後藤 石川 飯田 安田 と表示されます。
この場合、9 回show_data関数が呼ばれる。
リストのノードのデータを全部表示させたい時や、リストのノードを開放する時に使うらしい。
void g_list_free( GList *list );
GList によって使用されているメモリを全て解放する。
リストの要素 が動的に割り当てられたメモリの場合は、最初に解放されなければならない。
開放の例
g_list_foreach(list, (GFunc)g_free, NULL);
g_list_free(list);
他にも、g_list_concat ,g_list_remove_link ,g_list_find_custom ,g_list_insert_sorted
などあるけれど、用はなさそう。