9_6.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 9_6.c                       */
  3. /*    费氏数组搜索                          */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. #define MAX  21                   /* 最大阵列容量         */
  7. struct element                    /* 记录结构宣告         */
  8. {
  9.    int key;                       /* dj寻键值             */
  10. };
  11. typedef struct element record;    /* 结构新型态           */
  12. record data[MAX] = {              /* 结构阵列宣告         */
  13.        2,   5,   7,   9,  17,  21,  25,
  14.       33,  46,  89, 100, 121, 127, 139,
  15.      237, 279, 302, 356, 455, 467, 500  };
  16. /* ---------------------------------------- */
  17. /*  费氏数组 - 计算费氏数                   */
  18. /* ---------------------------------------- */
  19. int fib(int n)
  20. {
  21.    if ( n <= 1 )                  /* N 是否小於壹         */
  22.       return n;                   /* 传回N                */
  23.    else
  24.       return fib(n-2) + fib(n-1); /* 递回计算费氏数       */
  25. }
  26. /* ---------------------------------------- */
  27. /*  计算费氏数组的 n 值当 Fn <= n + 1       */
  28. /* ---------------------------------------- */
  29. int fibindex(int n)
  30. {
  31.    int temp;
  32.    temp = 1;                      /* 建定temp值           */
  33.    while ( fib(temp) <= n + 1 )   /* 比较回路             */
  34.       temp++;                     /* 如果成立temp加一     */
  35.    return temp - 1;               /* 传回n                */
  36. }
  37. /* ---------------------------------------- */
  38. /*  费氏数组搜索                            */
  39. /* ---------------------------------------- */
  40. int fibsearch(int n,int key)
  41. {
  42.    int index;                     /* 费氏数的n值          */
  43.    int mid;                       /* 费氏数的变数         */
  44.    int fn1;                       /* 前一个费氏数         */
  45.    int fn2;                       /* 前二个费氏数         */
  46.    int temp;
  47.    index = fibindex(n + 1);       /* 计算Fn <= n + 1      */
  48.    mid = fib(index - 1);          /* 起始的费氏数         */
  49.    fn1 = fib(index - 2);          /* 前一个费氏数         */
  50.    fn2 = fib(index - 3);          /* 前二个费氏数         */
  51.    while ( mid != 0 )             /* 费氏搜索主回路       */
  52.    {
  53.       if ( key < data[mid-1].key )  /* 比较小             */
  54.          if ( fn2 <= 0 )
  55.             mid = 0;              /* 没有找到             */
  56.          else
  57.          {
  58.             mid = mid - fn2;      /* 左子树新费氏数       */
  59.             temp = fn1;
  60.             fn1 = fn2;            /* 前一个费氏数         */
  61.             fn2 = temp - fn2;     /* 前二个费氏数         */
  62.          }
  63.       else
  64.          if ( key > data[mid-1].key ) /* 比较大           */
  65.             if ( fn1 <= 1 )
  66.                mid = 0;           /* 没有找到             */
  67.             else
  68.             {
  69.                mid = mid + fn2;   /* 右子树新费氏数       */
  70.                fn1 = fn1 - fn2;   /* 前一个费氏数         */
  71.                fn2 = fn2 - fn1;   /* 前二个费氏数         */
  72.             }
  73.          else
  74.             return mid - 1;       /* 找到了               */
  75.    }
  76.    return -1;                     /* 没有找到             */
  77. }
  78. /* ---------------------------------------- */
  79. /*  主程式: 在一个已排序的阵列, 接着输入    */
  80. /*  值用费氏数组搜索来找值.                 */
  81. /* ---------------------------------------- */
  82. void main()
  83. {
  84.    int found;                     /* 是否找到变数         */
  85.    int value;                     /* 搜索值的内容         */
  86.    while ( 1 )                    /* 主回路开始           */
  87.    {
  88.       printf("n请输入搜索值(0-500) ==> ");
  89.       scanf("%d",&value);         /* 读入搜索值           */
  90.       if ( value != -1 )
  91.       {
  92.          found = fibsearch(MAX,value);  /*呼叫费氏数组搜索*/
  93.          if ( found != -1 )
  94.             printf("找到搜索值:%d[%d]n",value,found);
  95.          else
  96.             printf("没有找到搜索值:%dn",value);
  97.       }
  98.       else
  99.          exit(1);                 /* 结束程式             */
  100.    }
  101. }