thisdesuのブログ

C言語はじめました

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

実践編:リスト2

前回のリスト形式の拡張で、特定の値から前の値に手繰れるように拡張します。
前回は新たに作成した時に、一つ前の情報に次の情報を保存しましたが、今回は、作成した情報に1つ前の構造体のアドレスを保存しておく事により、特定の情報を見れれば、前の情報へ手繰れるっと言う仕組みです。

■サンプルコード

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

// 特定の情報
typedef struct _item {
  int    val;
  struct _item *prev;
  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->prev = 0x00;
    item->next = 0x00;

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

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

    return item;
}

int main() {
    ITEM *top = 0x00;
    ITEM *tmp = 0x00;
    ITEM *lst = 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で進んで(next)出力
    for( tmp=top; tmp != 0x00 ; tmp = tmp->next) {
         printf("val:%d\n",tmp->val);
         lst = tmp;
    }

    // 最後の値からLISTで戻って(prev)出力
    for( tmp=lst; tmp != 0x00 ; tmp = tmp->prev) {
         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
val:789
val:456
val:123