• 哈希查找

    哈希查找

    1. #include <stdio.h>
    2. #include <malloc.h>
    3. #define MaxSize 100 /*哈希表最大长度*/
    4. typedef int KeyType;
    5. typedef struct node
    6. {
    7. KeyType key; /*关键字值*/
    8. int si; /*探查次数*/
    9. struct node *next;
    10. } Node; /*数据结点类型*/
    11. typedef struct
    12. {
    13. Node *link;
    14. } HNode; /*头结点类型*/
    15. void CreateHT(HNode *ht[],KeyType a[],int n,int p) /*构造哈希表*/
    16. {
    17. int i,d,cnt;
    18. Node *s,*q;
    19. for (i=0;i<p;i++) /*所有头结点的link域置空*/
    20. {
    21. ht[i]=(HNode *)malloc(sizeof(HNode));
    22. ht[i]->link=NULL;
    23. }
    24. for (i=0;i<n;i++)
    25. {
    26. cnt=1;
    27. s=(Node *)malloc(sizeof(Node)); /*构造一个数据结点*/
    28. s->key=a[i];s->next=NULL;
    29. d=a[i]%p; /*求其哈希地址*/
    30. if (ht[d]->link==NULL)
    31. {
    32. ht[d]->link=s;
    33. s->si=cnt;
    34. }
    35. else
    36. {
    37. q=ht[d]->link;
    38. while (q->next!=NULL)
    39. {
    40. q=q->next;cnt++;
    41. }
    42. cnt++;
    43. s->si=cnt;q->next=s;
    44. }
    45. }
    46. }
    47. void DispHT(HNode *ht[],int n,int p) /*输出哈希表*/
    48. {
    49. int i,sum=0;
    50. Node *q;
    51. printf("哈希表:\n");
    52. for (i=0;i<p;i++)
    53. {
    54. q=ht[i]->link;
    55. printf("%d:link->",i);
    56. while (q!=NULL)
    57. {
    58. sum+=q->si;
    59. printf("[%d,%d]->",q->key,q->si);
    60. q=q->next;
    61. }
    62. printf("∧\n");
    63. }
    64. printf("\n平均查找长度:ASL=%g\n",1.0*sum/n);
    65. }
    66. void main()
    67. {
    68. HNode *ht[MaxSize];
    69. KeyType a[]={87,25,310,8,27,132,68,95,187,123,70,63,47};
    70. int n=13,p=13;
    71. CreateHT(ht,a,n,p);
    72. DispHT(ht,n,p);
    73. }