当前位置:   article > 正文

数据结构DAY4--哈希表

数据结构DAY4--哈希表

哈希表

概念:相当于字典,可以根据数据的关键字来寻找相关数据的查找表。

步骤:建立->插入->遍历->查找->销毁

建立

建立数据,形式随意,但一般为结构体(储存的数据量大);建立表结构体,包括储存数据的数据为和表结构体类型的指针(用于指向下一位)。

  1. typedef struct hsnode
  2. {
  3. DATA_TYPE data;
  4. struct hsnode *pnext;
  5. }HASH_NODE;

接着用该结构体定义出一个大小为HASN_SIZE的哈希表:

HASH_NODE *hash_table[HASN_SIZE] = {NULL};

建立查找方法:根据具体的数据使用不同的方法,如汉字拼音可用拼音首子母来查找,将拼音转化为数字,根据数字来搜寻所需的数据域所对应的其余数据。

  1. int hash_fun(char ch)
  2. {
  3. if (ch >= 'a' && ch <= 'z')
  4. {
  5. return ch-'a';
  6. }
  7. else if (ch >= 'A' && ch <= 'Z')
  8. {
  9. return ch-'A';
  10. }
  11. else
  12. {
  13. return HASN_SIZE-1;
  14. }
  15. }
插入

用表结构体定义一个大小为结构体大小的指针结点,使其数据域为输入的数据,后驱指针指向空,用建立的查找方法获得该结构体的角标,然后使后驱指针指向角标为获得的角标的哈希表,并使该表值为带新数据的表头。

  1. int insert_hash_table(DATA_TYPE data)
  2. {
  3. HASH_NODE *pnode = malloc(sizeof(HASH_NODE));
  4. if (NULL == pnode)
  5. {
  6. perror("fail malloc");
  7. return -1;
  8. }
  9. pnode->data = data;
  10. pnode->pnext = NULL;
  11. int addr = hash_fun(data.name[0]);
  12. pnode->pnext = hash_table[addr];
  13. hash_table[addr] = pnode;
  14. return 0;
  15. }
遍历

用循环来遍历表头,在循环内,建立一个指针,指向哈希表,再建立一个循环,若哈希表不指向空,就遍历该表,并打印表的内容。

  1. void hash_for_each()
  2. {
  3. for (int i = 0; i < HASN_SIZE; i++)
  4. {
  5. HASH_NODE *ptmp = hash_table[i];
  6. while (ptmp != NULL)
  7. {
  8. printf("%s %s %s %d\n", ptmp->data.name, ptmp->data.tel, ptmp->data.addr, ptmp->data.age);
  9. ptmp = ptmp->pnext;
  10. }
  11. printf("\n");
  12. }
  13. }
查找

用表结构体定义一个指针,其值为角标为自定义的哈希函数的返回值的哈希表,只要其表结点不为空,就对比输入的搜索条件与表数据域相关内容,相同则返回,不同则使指针指向后驱结点继续对比

  1. HASH_NODE *find_hash_table(char *name)
  2. {
  3. int addr = hash_fun(name[0]);
  4. HASH_NODE *ptmp = hash_table[addr];
  5. while (ptmp != NULL)
  6. {
  7. if (!strcmp(name, ptmp->data.name))
  8. {
  9. return ptmp;
  10. }
  11. ptmp = ptmp->pnext;
  12. }
  13. return NULL;
  14. }
销毁

用表结构体定义一个指针,设置一个循环次数为哈希表长度的循环,再嵌套一个循环,若角标为循环次数的哈希表不为空(循环条件),则使指针等于角标为循环次数的哈希表,并使该哈希表值为指针的后驱结点,最后释放指针即可

  1. void destroy_hash_table()
  2. {
  3. HASH_NODE *ptmp = NULL;
  4. for (int i = 0; i < HASN_SIZE; i++)
  5. {
  6. while(hash_table[i] != NULL)
  7. {
  8. ptmp = hash_table[i];
  9. hash_table[i] = ptmp->pnext;
  10. free(ptmp);
  11. }
  12. }
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/419112
推荐阅读
相关标签
  

闽ICP备14008679号