自己組織化探索
http://www.geocities.jp/ky_webid/algorithm/013.html
検索結果位置を保存しておくということですか、やってみます。
リスト構造は循環リスト再実装 - (void*)Pないとで作った物を利用します。
#include <stdio.h> #include <stdlib.h> struct LIST { int data; struct LIST *next; struct LIST *prev; }; typedef struct LIST LIST; LIST *create_list(int data); LIST *add_list (LIST *p,int data); LIST *self_search(LIST *p,int data); void free_list (LIST *p); LIST *create_list(int data) { LIST *p; p = (LIST *)malloc(sizeof(LIST)); if ( p == NULL ) { return NULL; } p->next = p; p->prev = p; p->data = data; return p; } LIST *add_list (LIST *p,int data) { LIST *a = create_list(data); a->next = p->next; a->prev = p; p->next->prev = a; p->next = a; return a; } void free_list (LIST *p) { LIST *s = p; LIST *q; do { q = p; p = p->next; free(q); q = NULL; } while ( s!=p ); } LIST *self_search(LIST *p,int data) { LIST *s = p; do{ // 確認用に何度ループしているか「.」を表示する printf("."); if ( p->data == data ) { return p; } p = p->next; } while( s!=p ); return NULL; } int main (void) { LIST *head; LIST *p; int i; head = create_list(0); for(i=0;i<30;++i) { add_list(head,i); } // まずは普通に検索する printf("25を検索"); if ( (p = self_search(head,25)) != NULL ) { puts("見つかりました"); } else { puts("見つかりませんでした"); } // もう一度同じ値で検索してみる。 printf("25を検索"); if ( (p = self_search(p,25)) != NULL ) { puts("見つかりました"); } else { puts("見つかりませんでした"); } // 更に別の値で検索してみる。 printf("10を検索"); if ( (p = self_search(p,10)) != NULL ) { puts("見つかりました"); } else { puts("見つかりませんでした"); } // 最後に存在しない値で検索してみる。 printf("99を検索"); if ( (p = self_search(p,99)) != NULL ) { puts("見つかりました"); } else { puts("見つかりませんでした"); } free_list(head); return 0; }
$ main 25を検索......見つかりました 25を検索.見つかりました 10を検索................見つかりました 99を検索...............................見つかりませんでした
素晴らしいですね。同じ値を検索する場合、一発目でヒットするようになっています。