実践編:リスト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