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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 9_7.c                       */
  3. /*    插补搜索                              */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. #define MAX  20                   /* 最大阵列容量         */
  7. struct element                    /* 记录结构宣告         */
  8. {
  9.    int key;                       /* 搜索键值             */
  10. };
  11. typedef struct element record;    /* 结构新型态           */
  12. record data[MAX] = {              /* 结构阵列宣告         */
  13.        2,   5,   7,   9,  17,  21,  25,
  14.       33,  46,  48,  51,  52,  63,  69,
  15.       77,  78,  80,  89,  94,  99 };
  16. /* ---------------------------------------- */
  17. /*  插补搜索                                */
  18. /* ---------------------------------------- */
  19. int intersearch(int n,int key)
  20. {
  21.    if ( key < data[0].key || key > data[n-1].key )
  22.       return -1;                  /* 没有找到             */
  23.    else
  24.       return interfind(key,0,n-1);  /* 递回呼叫         */
  25. }
  26. /* ---------------------------------------- */
  27. /*  插补搜索递回处理                        */
  28. /* ---------------------------------------- */
  29. int interfind(int key,int left,int right)
  30. {
  31.    int next_guess;                /* 下一个可能索引       */
  32.    int offset;                    /* 索引位移             */
  33.    int range;                     /* 键值范围             */
  34.    int index_range;               /* 索引范围             */
  35.    int temp;
  36.    if ( data[left].key == key )   /* 找到了               */
  37.       return left;
  38.    else
  39.       /* 没有找到 */
  40.       if ( left == right ||
  41.            data[left].key == data[right].key )
  42.          return -1;
  43.       else
  44.       {
  45.          index_range = right - left;  /* 计算索引范围     */
  46.          /* 计算键值范围 */
  47.          range = data[right].key - data[left].key;
  48.          offset = key - data[left].key;   /* 计算键值位移 */
  49.          temp = ( offset * index_range )  / range;
  50.          next_guess = left + temp;      /* 下一个可能索引 */
  51.          if ( next_guess == left )      /* 己试过         */
  52.             next_guess++;
  53.          if ( key < data[next_guess].key )
  54.             /* 左边部分递回呼叫插补搜索 */
  55.             return interfind(key,left,next_guess - 1);
  56.          else
  57.             /* 右边部分递回呼叫插补搜索 */
  58.             return interfind(key,next_guess,right);
  59.       }
  60. }
  61. /* ---------------------------------------- */
  62. /*  主程式: 在一个已排序的阵列, 接着输入    */
  63. /*  值用插补搜索来找值.                     */
  64. /* ---------------------------------------- */
  65. void main()
  66. {
  67.    int found;                     /* 是否找到变数         */
  68.    int value;                     /* 搜索值的内容         */
  69.    while ( 1 )                    /* 主回路开始           */
  70.    {
  71.       printf("n请输入搜索值(0-100) ==> ");
  72.       scanf("%d",&value);         /* 读入搜索值           */
  73.       if ( value != -1 )
  74.       {
  75.          found = intersearch(MAX,value);  /* 呼叫插补搜索 */
  76.          if ( found != -1 )
  77.             printf("找到搜索值:%d[%d]n",value,found);
  78.          else
  79.             printf("没有找到搜索值:%dn",value);
  80.       }
  81.       else
  82.          exit(1);                 /* 结束程式             */
  83.    }
  84. }