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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程序实例: 9_9_3.c                     */
  3. /*    链表的散列查找                    */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #define MAX    10                 /* 最大数组容量     */
  8. #define NUM    10                 /* 随机数产生的个数   */
  9. struct list                       /* 链表结构声明     */
  10. {
  11.    int key;                       /* 键值             */
  12.    struct list *next;             /* 指向下一结点     */
  13. };
  14. typedef struct list node;         /* 定义新类型       */
  15. typedef node *link;               /* 定义新类型指针   */
  16. node hashtable[MAX];              /* 散列表声明       */
  17. /* ---------------------------------------- */
  18. /*  散列函数                                */
  19. /* ---------------------------------------- */
  20. int hashfunc(int value)
  21. {
  22.    return value % MAX;            /* 余数             */
  23. }
  24. /* ---------------------------------------- */
  25. /*  链表的散列查找                      */
  26. /* ---------------------------------------- */
  27. int linkhash(int key)
  28. {
  29.    link ptr;                      /* 开始指针         */
  30.    int pos;                       /* 位置变量         */
  31.    /* 调用散列函数计算位置 */
  32.    pos = hashfunc(key);
  33.    ptr = hashtable[pos].next;     /* 取得开始指针     */
  34.    while ( ptr != NULL )          /* 线性探测回路     */
  35.       if ( ptr->key == key )      /* 是否找到了       */
  36.          return 1;
  37.       else
  38.          ptr = ptr->next;         /* 下一个节点       */
  39.    return 0;
  40. }
  41. /* ---------------------------------------- */
  42. /*  建立散列表                              */
  43. /* ---------------------------------------- */
  44. void createtable(int key)
  45. {
  46.    link ptr;                      /* 开始指针         */
  47.    link new;                      /* 串列的开始指针   */
  48.    int pos;                       /* 位置变数         */
  49.    /* 建立一个节点 */
  50.    new = ( link ) malloc(sizeof(node)); /* 配置记忆体 */
  51.    new->key = key;                /* 存入散列表       */
  52.    new->next = NULL;              /* 建立指针初值     */
  53.    /* 呼叫散列函数计算位置 */
  54.    pos = hashfunc(key);
  55.    ptr = hashtable[pos].next;     /* 取得开始指针     */
  56.    if ( ptr != NULL )             /* 寻找存入位置     */
  57.    {
  58.       new->next = ptr;            /* 插入节点         */
  59.       hashtable[pos].next = new; /* 链结节点         */
  60.    }
  61.    else
  62.       hashtable[pos].next = new; /* 链结节点         */
  63. }
  64. /* ---------------------------------------- */
  65. /*  主程序: 散列查找法.                     */
  66. /* ---------------------------------------- */
  67. void main()
  68. {
  69.    link ptr;                      /* 开始指针         */
  70.    int checked[50];               /* 检查数组         */
  71.    int i,temp;
  72.    long temptime;
  73.    for ( i = 0; i < MAX; i++ )
  74.       hashtable[i].next = NULL;   /* 清除散列表       */
  75.    for ( i = 0; i < 50; i++ )
  76.       checked[i] = 0;             /* 清除检查数组     */
  77.    srand(time(&temptime) % 60);   /* 使用时间初始随机数 */
  78.    i = 0;
  79.    while ( i != NUM )             /* 产生数组值的回路 */
  80.    {
  81.       temp = rand() % 50;         /* 随机数取值 0-49    */
  82.       if ( checked[temp] == 0 )   /* 是否是已有的值   */
  83.       {
  84.          createtable(temp);       /* 建立散列表       */
  85.          checked[temp] = 1;       /* 设定此值产生过   */
  86.          i++;                     /* 下一个数组值     */
  87.       }
  88.    }
  89.    printf("散列表内容:n");
  90.    for ( i = 0; i < MAX; i++ )    /* 列印结构数组     */
  91.    {
  92.       printf("n%2d ==> ",i);
  93.       ptr = hashtable[i].next;   /* 取得开始指针     */
  94.       while ( ptr != NULL )       /* 列印串列回路     */
  95.       {
  96.          printf("[%2d]",ptr->key);  /* 印出内容       */
  97.          ptr = ptr->next;         /* 下一节点         */
  98.       }
  99.    }
  100.    while ( 1 )                    /* 主回路开始       */
  101.    {
  102.       printf("n请输入查找值(0-49) ==> ");
  103.       scanf("%d",&temp);          /* 读入查找值       */
  104.       if ( temp != -1 )
  105.       {
  106.          i = linkhash(temp);      /* 呼叫散列查找     */
  107.          if ( i != 0 )
  108.             printf("找到查找值:%dn",temp);
  109.          else
  110.             printf("没有找到查找值:%dn",temp);
  111.       }
  112.       else
  113.          exit(1);                 /* 结束程序         */
  114.    }
  115. }