GLib の双方向リスト!

C 言語用のハッシュテーブル探してる方が多いみたいです。僕もどんなのがあるか調べてみたんですが、やっぱり GLib か APR か、という気がします。

以前も GLib のハッシュテーブルを紹介しましたが、せっかくなので再チャレンジしましょう!が、今回は前哨戦で GLib の GList (双方向リスト) です!

API リファレンスはこれです:https://developer.gnome.org/glib/2.40/glib-Doubly-Linked-Lists.html

あと、コンパイルの仕方は gcc -Wall -pedantic `pkg-config –cflags –libs glib-2.0` hoge.c です。

#include <glib.h>
#include <glib/gprintf.h>

void print_list_item(gpointer data, gpointer user_data);

int main(int argc, char *argv[])
{
  /* GList は双方向リスト */
  GList *lst;
  GList *item;
  GList *another_lst;
  /* int と同じ */
  gint i;

  /* リストの作成には g_list_prepend を使う。第一引数は NULL */
  lst = g_list_prepend(NULL, "最初のデータ");
  /* prepend と append は各々スタックの unshift, push に相当する */
  /* prepend のオーダは O(1), append は O(n) */
  lst = g_list_append(lst,  "2番目のデータ");
  lst = g_list_append(lst,  "3番目のデータ");

  /* 最初の要素を取得する。gchar は char と同じ */
  item = g_list_first(lst);
  g_printf("%s\n", (gchar*)item->data);
  /* 2番めの要素を取得する */
  /* ただし、この場合は item = g_list_next(item) の方が手っ取り早い */
  item = g_list_nth(lst, 1);
  g_printf("%s\n", (gchar*)item->data);
  /* 最後の要素を取得する */
  item = g_list_last(lst);
  g_printf("%s\n", (gchar*)item->data);

  /* 要素を挿入する */
  lst = g_list_insert(lst, "4番目のデータ", 1);
  /* 要素を挿入する(別の方法) */
  lst = g_list_insert_before(lst, g_list_last(lst), "5番目のデータ");
  /* 最後から2番めに挿入する場合、g_list_last の代わりに
   * NULL を入れても同じ
   */
  lst = g_list_insert_before(lst, NULL, "6番目のデータ");

  /* 要素を削除する */
  /* free する必要がある時は g_list_delete_link を使う */
  lst = g_list_remove(lst, g_list_first(lst)->data);

  /* for ループ */
  g_printf("\n----- for ループ ------\n\n");
  for (item = lst, i = 0; item != NULL; item = g_list_next(item)) {
    print_list_item(item->data, &i);
  }

  /* for each */
  g_printf("\n----- for each ------\n\n");
  i = 0;
  g_list_foreach(lst, print_list_item, &i);

  /* ソート */
  g_printf("\n----- ソート ------\n\n");
  lst = g_list_sort(lst, (GCompareFunc)g_strcmp0);
  i = 0;
  g_list_foreach(lst, print_list_item, &i);

  /* リストのコピー */
  another_lst = g_list_copy(lst);

  /* 逆順に並び替え */
  another_lst = g_list_reverse(another_lst);

  /* リストの連結 */
  lst = g_list_concat(lst, another_lst);

  g_printf("\n----- リストの連結 ------\n\n");
  i = 0;
  g_list_foreach(lst, print_list_item, &i);

  /* リストの破壊 */
  /* 各要素も free する時は g_list_free_full を使う */
  g_list_free(lst);

  return 0;
}

void print_list_item(gpointer data, gpointer user_data)
{
  /* printf と同じ */
  g_printf("%d: %s\n", (*(gint*)user_data)++, (gchar*)data);
}

実行結果:

最初のデータ
2番目のデータ
3番目のデータ

----- for ループ ------

0: 4番目のデータ
1: 2番目のデータ
2: 5番目のデータ
3: 3番目のデータ
4: 6番目のデータ

----- for each ------

0: 4番目のデータ
1: 2番目のデータ
2: 5番目のデータ
3: 3番目のデータ
4: 6番目のデータ

----- ソート ------

0: 2番目のデータ
1: 3番目のデータ
2: 4番目のデータ
3: 5番目のデータ
4: 6番目のデータ

----- リストの連結 ------

0: 2番目のデータ
1: 3番目のデータ
2: 4番目のデータ
3: 5番目のデータ
4: 6番目のデータ
5: 6番目のデータ
6: 5番目のデータ
7: 4番目のデータ
8: 3番目のデータ
9: 2番目のデータ

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中