thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

実践編:リスト

そろそろC言語の言語から良く使う手法等のステップアップして実践編へ進みます。(と言うより言語ネタは尽きてきた)
特定の値をリスト形式にしたい場合に、特定の値の中に次の値に辿れる様にする事があります。この特定の値とは構造体で好きな形として定義してやり、この構造体の中に同じ構造体のポインタを保存出来るようにしてあげます。一つの情報を作成したら、次が出来た時点で次の構造体のアドレスを保存してあげる事により、特定の情報を見れれば、次の情報へ手繰れるっと言う仕組みです。

■サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

// 特定の情報
typedef struct _item {
  int    val;
  struct _item *next;
} ITEM;

// 情報の追加用関数
ITEM *_add(ITEM *top,int val) {
    ITEM *item;

    // 領域作成
    item = (ITEM*)malloc(sizeof(ITEM));
    if (item==0x00){
        return 0x00;
    }
    // 初期化
    memset(item,0x00,sizeof(ITEM));

    // 値を設定
    item->val = val;
    item->next = 0x00;

    // 最初の情報なら終わり
    if (top == 0x00) {
        return item;
    }
    // 最後の情報までnext手繰る
    for( ; top != 0x00 && top->next != 0x00 ; top = top->next) ;

    // nextに作成したアドレスを設定
    top->next = item;

    return item;
}

int main() {
    ITEM *top = 0x00;
    ITEM *tmp = 0x00;

    // 値の追加、2回目以降は最初のアドレスを教えあげる
    if ((top = _add(0x00,123)) == 0x00) { printf("error\n");return(1); }
    if ((tmp = _add(top,456)) == 0x00)  { printf("error\n");return(1); }
    if ((tmp = _add(top,789)) == 0x00)  { printf("error\n");return(1); }

    // 最初の値からLISTで出力
    for( tmp=top; tmp != 0x00 ; tmp = tmp->next) {
         printf("val:%d\n",tmp->val);
    }

    // 最後はfreeしておく
    for( tmp=top; tmp != 0x00 ; tmp = tmp->next) {
         free(tmp);
    }

    return(0);
}


■結果

$ gcc main.c
$ ./a.out
val:123
val:456
val:789