哈希查找

  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. }