モーニング娘で学ぶ  GList

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 などあるけれど、用はなさそう。


もどる