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_list_nth_dataを使い、4番目のノードデータを取得
  g_free(g_list_nth_data(list, 3));
  //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でハッシュテーブルを作成
  //キーも値も文字列ならGDestroyNotify関数としてg_freeを指定
  hash = g_hash_table_new_full(g_str_hash, g_str_equal, (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を破棄する関数。 キーと値を直接メモリ上に確保した場合は、先ずそれらを解放する必要が有る。


前章  | 目次 |  次章



トップ



/