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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 9_9_2.c                     */
  3. /*    线性探测法的哈希搜索                  */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #define MAX    10                 /* 最大阵列容量       */
  8. #define NUM     8                 /* 乱数产生的个数     */
  9. #define BLANK  -1                 /* 空白空间           */
  10. int hashtable[MAX];              /* 哈希表宣告         */
  11. /* ---------------------------------------- */
  12. /*  哈希函数                                */
  13. /* ---------------------------------------- */
  14. int hashfunc(int value)
  15. {
  16.    return value % MAX;            /* 馀数               */
  17. }
  18. /* ---------------------------------------- */
  19. /*  线性探测法                              */
  20. /* ---------------------------------------- */
  21. int linehash(int key)
  22. {
  23.    int pos;                       /* 位置变数           */
  24.    int temp;
  25.    /* 呼叫哈希函数计算位置 */
  26.    pos = hashfunc(key);
  27.    temp = pos;                    /* 保留开始位置       */
  28.    while ( hashtable[temp] != key &&   /* 线性探测回路 */
  29.            hashtable[temp] != BLANK )
  30.    {
  31.       /* 使用馀数将阵列变为环状 */
  32.       temp = ( temp + 1 ) % MAX;  /* 下一个位置         */
  33.       if ( pos == temp )          /* 查询结束           */
  34.          return -1;               /* 没有找到           */
  35.    }
  36.    if ( hashtable[temp] == BLANK )   /* 是否是空白     */
  37.       return -1;                  /* 没有找到           */
  38.    else
  39.       return temp;                /* 找到了             */
  40. }
  41. /* ---------------------------------------- */
  42. /*  建立哈希表                              */
  43. /* ---------------------------------------- */
  44. void createtable(int key)
  45. {
  46.    int pos;                       /* 位置变数           */
  47.    int temp;
  48.    /* 呼叫哈希函数计算位置 */
  49.    pos = hashfunc(key);
  50.    temp = pos;                    /* 保留开始位置       */
  51.    while ( hashtable[temp] != BLANK )  /* 寻找存入位置 */
  52.    {
  53.       temp = ( temp + 1 ) % MAX;  /* 下一个位置         */
  54.       if ( pos == temp )          /* 哈希表是否己满     */
  55.       {
  56.          printf("哈希表己满!n");
  57.          return;
  58.       }
  59.    }
  60.    hashtable[temp] = key;        /* 存入哈希表         */
  61. }
  62. /* ---------------------------------------- */
  63. /*  主程式: 哈希搜索法.                     */
  64. /* ---------------------------------------- */
  65. void main()
  66. {
  67.    int checked[50];               /* 检查阵列           */
  68.    int i,j,temp;
  69.    long temptime;
  70.    for ( i = 0; i < MAX; i++ )
  71.       hashtable[i] = BLANK;       /* 清除哈希表         */
  72.    for ( i = 0; i < 50; i++ )
  73.       checked[i] = 0;             /* 清除检查阵列       */
  74.    printf("哈希表内容:n");
  75.    srand(time(&temptime) % 60);   /* 使用时间初始乱数   */
  76.    i = 0;
  77.    while ( i != NUM )             /* 产生阵列值的回路   */
  78.    {
  79.       temp = rand() % 50;         /* 乱数取值 0-49      */
  80.       if ( checked[temp] == 0 )   /* 是否是已有的值     */
  81.       {
  82.          createtable(temp);       /* 建立哈希表         */
  83.          printf("%2d => ",temp);
  84.          for ( j = 0; j < MAX; j++ )  /* 列印哈希表     */
  85.             printf("[%2d]",hashtable[j]);
  86.          printf("n");            /* 换行               */
  87.          checked[temp] = 1;       /* 设定此值产生过     */
  88.          i++;                     /* 下一个阵列值       */
  89.       }
  90.    }
  91.    while ( 1 )                    /* 主回路开始         */
  92.    {
  93.       printf("n请输入搜索值(0-49) ==> ");
  94.       scanf("%d",&temp);          /* 读入搜索值         */
  95.       if ( temp != -1 )
  96.       {
  97.          i = linehash(temp);      /* 呼叫哈希搜索       */
  98.          if ( i != -1 )
  99.             printf("找到搜索值:%d[%d]n",temp,i);
  100.          else
  101.             printf("没有找到搜索值:%dn",temp);
  102.       }
  103.       else
  104.          exit(1);                 /* 结束程式           */
  105.    }
  106. }