線形リスト(片方向)
http://www.geocities.jp/ky_webid/algorithm/010.html
さてとうとうmalloc関数を使って動的に拡張していくタイプの処理に入りました。
このあたりのリスト構造を極めれば今後割りと何でも作れそうな気がします。
ということでここは何としてもキッチリと押さえたいですね。
さて、さっそくいつものように実装しようとしたのですが、言葉だけではいまいちどういったものかイメージできなかったので今回は先に実装を軽く見て理解したうえで自分なりに実装してみます。
#include <stdio.h> #include <stdlib.h> struct LIST { int data; struct LIST *next; }; typedef struct LIST LIST; LIST *create_list() { LIST *p; p = (LIST *)malloc(sizeof(LIST)); if ( p == NULL ) { // メモリ不足エラー return NULL; } p->next = NULL; printf("create %p\n",p); return p; } void add_list (LIST *p,int data) { LIST *add,*q; add = create_list(); add->data = data; q = p; while( p != NULL ){ q = p; p = p->next; } q->next = add; } void free_list (LIST *p) { LIST *q; while( p != NULL ){ q = p; p = p->next; printf("free %p\n",q); free(q); q = NULL; } } void delete_list (LIST *p,int data) { LIST *q; while( p != NULL ){ q = p; p = p->next; if ( p->data == data ) { q->next = p->next; printf("free %p\n",p); free(p); p = NULL; // まだ同じ値の要素があるかもしれないので引き続き検索する p = q->next; } } } void show_list (LIST *head) { LIST *p; p = head; while( (p = p->next) != NULL){ printf("%d\n",p->data); } } int main (void) { LIST *head; head = create_list(); add_list(head,100); add_list(head,200); add_list(head,300); add_list(head,200); delete_list(head,200); show_list(head); free_list(head); return 0; }
create 00383148 create 00383158 create 00383168 create 00383178 create 00383188 free 00383168 free 00383188 100 300 free 00383148 free 00383158 free 00383178
実装できました。
createとfreeのデバッグ表示は確保したメモリがちゃんと開放されてるかを確認するためです。
これを見る限りうまくいってますね。