![]() |
![]() |
![]() |
GList型の変数に対応する関数
One Two Three … Tenの文字列を昇順にソートして表示してみる。
|
#include <glib.h> static gint compare_function(gconstpointer a, gconstpointer b) { return strcmp( (gchar*)a, (gchar*)b ); } static void print_data(gpointer data, gpointer user_data) { g_print( "%s ", (gchar*)data ); } int main(int argc, char** argv) { //g_list_appendを呼び出すのにNULLで初期化
GList *list = NULL;gchar *data[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"}; int i; //g_list_appendでリストを作成
for( i = 0; i < 10; ++i ){list = g_list_append(list, (gpointer)data[i]); } //g_list_nth_dataでn番目のデータを順に取得、表示
for( i = 0; i < 10; ++i ){g_print( "%s ", (gchar*)g_list_nth_data(list, i)); } g_print( "\n" ); //strcmpとg_list_sort使ってリストのデータを昇順にソート
list = g_list_sort(list, compare_function); //g_list_foreachで昇順にソートされたデータを表示
g_list_foreach(list, (GFunc)print_data, NULL);g_print( "\n" ); //リストの領域を解放
g_list_free(list);return 0; } |
使った関数を紹介してみる。
第1引数:リスト
第2引数:追加するデータ
戻り値:リストの先頭アドレス
第1引数:リスト
第2引数:ノード番号
戻り値:指定したノードのアドレス(n番目のリストのデータ)
第1引数:リスト
第2引数:ソート関数
戻り値:ソートされたリストの先頭アドレス
compare_funcに従ってノードをソートする。
第1引数:リスト
第2引数:ノードに対して適用する関数
第3引数:第2引数の関数の引数に与えるデータ
リストの各ノードに対して関数funcを実行する。
第1引数:リスト
リストを解放する。
リストのデータが動的に領域を確保した物である場合、この関数を呼び出す前に、それらの領域を開放しておく必要が有る。
データの追加と削除
One Two Four に Three を追加して、Four を削除する。
|
#include <glib.h> int main(int argc, char** argv) { GList *list = NULL, *work; gchar *data[] = {"One", "Two", "Four"}; int i; //g_strdupでコピーしたデータのリストを作成
for( i = 0; i < 3; ++i ){list = g_list_append(list, (gpointer)g_strdup(data[i])); } for( work = list; work; work = g_list_next(work) ){ g_print( "%s ", (gchar*)work->data ); } g_print( "\n" ); //2番目と3番目のノードの間に新しいデータ"Three"を持つノードを挿入
list = g_list_insert(list, (gpointer)g_strdup("Three"), 2);for( work = list; work; work = g_list_next(work) ){ g_print( "%s ", (gchar*)work->data ); } g_print( "\n" ); //ノードを削除する前にg_strdupで動的に確保した領域を解放
g_free(g_list_nth_data(list, 3));//g_list_nth_dataを使い、4番目のノードデータを取得 //g_list_nthを使い、削除するノードを取得
list = g_list_delete_link(list, g_list_nth(list, 3));for( work = list; work; work = g_list_next(work) ){ g_print( "%s ", (gchar*)work->data ); } g_print( "\n" ); //動的に領域を確保しているので、各データ領域をg_freeで解放
g_list_foreach(list, (GFunc)g_free, NULL);g_list_free(list); return 0; } |
ここで使った関数を紹介して見る。
第1引数:リスト
戻り値:次のノードのアドレス
第1引数:リスト
第2引数:追加するデータ
第3引数:データを追加する位置
戻り値:リストの先頭アドレス
指定した位置にデータを挿入する。
指定した位置がリストに無い場合は、リストの最後尾にデータを追加する。
第1引数:リスト
第2引数:削除するノードの先頭アドレス
戻り値:リストの先頭アドレス
リストから指定した位置のノードを削除する。
リストのデータが動的に確保された物である場合、この関数を呼び出す前に、
削除するノードのデータ領域を解放しておく必要が有る。
ハッシュ
g_hash_table_から始まる関数によってハッシュテーブルを操作する。 GLibではGHashTableという構造体で定義されている。
サンプルではキーも値も文字列でハッシュテーブルを構成し、キーから値を検索して、標準出力に表示する。
|
#include <glib.h> int main(int argc, char** argv) { GHashTable *hash; gchar *data[] = {"hard", "normal", "easy"}; int i; //g_hash_table_new_fullでハッシュテーブルを作成
hash = g_hash_table_new_full(g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free);//キーも値も文字列ならGDestroyNotify関数としてg_freeを指定 //g_hash_table_insertを使い指定したキーで値を登録
g_hash_table_insert(hash, g_strdup(data[0]), g_strdup("+0"));g_hash_table_insert(hash, g_strdup(data[1]), g_strdup("+10")); g_hash_table_insert(hash, g_strdup(data[2]), g_strdup("+20")); //登録されている値を表示、値の検索にg_hash_table_lookup関数を使う
for( i = 0; i < 3; ++i ){g_print( "Key: %s => Value: %s\n", data[i], (gchar*)g_hash_table_lookup(hash, (gconstpointer)data[i])); } //g_hash_table_destroyで使わなくなったハッシュテーブルを破棄
g_hash_table_destroy(hash);return 0; } |
使用した関数を紹介して見る。
第1引数:ハッシュ関数
第2引数:キーチェック関数
第3引数:キー用のメモリ領域を解放する関数
第4引数:値用のメモリ領域を解放する関数
戻り値:生成されたハッシュテーブル
新規にGHashTableを生成する関数。
GHashTableから要素を削除する際に、キーと値が確保していた領域を開放するのに呼び出す関数を、
指定する事が可能。
第1引数:ハッシュテーブル
第2引数:キー
第3引数:値
新しいキーと値を挿入する。
第1引数:ハッシュテーブル
第2引数:キー
戻り値:指定したキーに対する値
GHashTableの中にあるキーを検索する。
第1引数:ハッシュテーブル
GHashTableを破棄する関数。
キーと値を直接メモリ上に確保した場合は、先ずそれらを解放する必要が有る。