数据布局哈希表-(开放地点法+二次探测法解决哈希冲突)(创建+删除+插入)+(C ...

打印 上一主题 下一主题

主题 819|帖子 819|积分 2467

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4. #define M 20
  5. #define NULLDEL -1
  6. #define DELDEY -2
  7. typedef struct
  8. {
  9.         int key;
  10.         int count;
  11. }HashTable;
  12. //创建和插入
  13. void Insert(HashTable ha[], int m, int p, int key)
  14. {
  15.         int i, HO, HI;
  16.         HO = key % p;
  17.         if (ha[HO].key == NULLDEL || ha[HO].key == DELDEY)
  18.         {
  19.                 ha[HO].key = key;
  20.                 ha[HO].count = 1;
  21.         }
  22.         else
  23.         {
  24.                 i = 1;
  25.                 do
  26.                 {
  27.                         HI = (HO + i * i) % m;
  28.                         i++;
  29.                 } while (ha[HI].key != NULLDEL && ha[HI].key != DELDEY);
  30.                 ha[HI].key = key;
  31.                 ha[HI].count = i;
  32.         }
  33. }
  34. void Create(HashTable ha[],int m,int n1,int p,int keys[])
  35. {
  36.         int i;
  37.         for (i = 0; i < m; i++)
  38.         {
  39.                 ha[i].key = NULLDEL;
  40.                 ha[i].count = 0;
  41.         }
  42.         for (i = 0; i < n1; i++)
  43.         {
  44.                 Insert(ha, m, p, keys[i]);
  45.         }
  46.         printf("二次探测法哈希表如下:\n");
  47.         for (i = 0; i < m; i++)
  48.         {
  49.                 printf("%d  查找次数 %d 次\n", ha[i].key,ha[i].count);
  50.         }
  51. }
  52. //查找
  53. int Search(HashTable ha[], int m, int p, int key)
  54. {
  55.         int HO, HI;
  56.         HO = key % p;
  57.         if (ha[HO].key == NULLDEL)
  58.         {
  59.                 ha[HO].count = 1;
  60.                 return -1;
  61.         }
  62.         else if (ha[HO].key == key)
  63.         {
  64.                 ha[HO].count = 1;
  65.                 return HO;
  66.         }
  67.         else
  68.         {
  69.                 ha[HO].count = 1;
  70.                 for (int i = 0; i < m; i++)
  71.                 {
  72.                         HI = (HO + i * i) % m;//HO还是那个HO,这里变的是HI和i的值
  73.                         if (ha[HI].key == NULLDEL)
  74.                         {
  75.                                 ha->count = ha[HO].count + i;//哈希冲突的次数
  76.                                 return -1;
  77.                         }
  78.                         else if (ha[HI].key == key)
  79.                         {
  80.                                 ha->count = ha[HO].count + i;
  81.                                 return HI;
  82.                         }
  83.                 }
  84.         }
  85. }
  86. //删除哈希值
  87. bool deleteNode(HashTable ha[], int m, int p, int key)
  88. {
  89.         int HO,i = 1;
  90.         HO = key % p;
  91.         while (ha[HO].key != NULLDEL && ha[HO].key != key)
  92.         {
  93.                 HO = (HO + i * i);
  94.                 i++;
  95.         }
  96.         if (ha[HO].key == key)
  97.         {
  98.                 ha[HO].key = DELDEY;
  99.                 return true;
  100.         }
  101.         else
  102.         {
  103.                 return false;
  104.         }
  105. }
  106. int main()
  107. {
  108.         HashTable ha[M];
  109.         int keys[] = { 19,14,23,1,68,20,84,27,55,11,10,79 };
  110.         int n1 = sizeof(keys) / sizeof(keys[0]);
  111.         int p = 13;
  112.         Create(ha, M, n1, p, keys);
  113.         int key = 79;
  114.         int result = Search(ha, M, p, key);
  115.         if (result!=-1)
  116.         {
  117.                 printf("找到 %d 位置在 %d 哈希冲突 %d 次\n", key, result, ha->count);
  118.         }
  119.         else {
  120.                 printf("找不到 %d 哈希冲突 %d 次\n", key, ha->count);
  121.         }
  122.        
  123.         key = 23;
  124.         deleteNode(ha, M, p, key);
  125.         printf("删除 %d 元素后遍历如下:\n", key);
  126.         for (int i = 0; i < M; i++)
  127.         {
  128.                 if (ha[i].key != NULLDEL && ha[i].key != DELDEY)
  129.                 {
  130.                         printf(" %d ", ha[i].key);
  131.                 }
  132.                 else {
  133.                         printf(" * ");
  134.                 }
  135.         }
  136.         return 0;
  137. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表