main.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <stdio.h>
  2. #include "table.h"
  3. #include <stdlib.h>
  4. int main(){
  5. HashTable *ht = make_HashTable();
  6. HashNode *tmp1 = make_HashNode("YY","Hello"), *tmp2 = make_HashNode("ZZ","World");
  7. login_node(ht, tmp1);
  8. login_node(ht, tmp2);
  9. printf("YY = %s, ZZ = %s\n", find_node(ht, "YY")->value, find_node(ht, "ZZ")->value);
  10. return 0;
  11. }
  12. HashTable *make_HashTable(){ // 生成并初始化
  13. HashTable *tmp = NULL;
  14. size_t size = sizeof(HashNode) * MAX_SIZE;
  15. tmp = malloc(sizeof(HashTable));
  16. tmp->HashNode = malloc(size);
  17. for(int i = 0; i < MAX_SIZE; i++){
  18. tmp->HashNode[i] = NULL; // 初始化
  19. }
  20. return tmp;
  21. }
  22. HashNode *make_HashNode(char *key, char *value){ // 生成并初始化
  23. HashNode *tmp = NULL;
  24. tmp = malloc(sizeof(HashNode));
  25. tmp->key = key;
  26. tmp->value = value;
  27. tmp->next = NULL;
  28. return tmp;
  29. }
  30. // 使用time33算法,把key换算成为索引,生成索引的范围在0-MAX_SIZE上[因为有 % MAX_SIZE]
  31. unsigned int time33(char *key){
  32. unsigned int hash = 5381;
  33. while(*key){
  34. hash += (hash << 5 ) + (*key++);
  35. }
  36. return (hash & 0x7FFFFFFF) % MAX_SIZE;
  37. }
  38. // 添加一个桶
  39. int login_node(HashTable *ht, HashNode *hn){
  40. // 检查数据是否合法
  41. if(hn == NULL){
  42. return 1;
  43. }
  44. else if(ht == NULL){
  45. return 1;
  46. }
  47. // 计算下标
  48. unsigned int index = time33(hn->key);
  49. HashNode *base_node = ht->HashNode[index]; // 根据下标拿base节点
  50. if(base_node == NULL){
  51. ht->HashNode[index] = hn; // 无冲突
  52. }
  53. else{
  54. // 有冲突
  55. while(1){
  56. if(base_node->next == NULL){ // 迭代找到最后一个节点
  57. break;
  58. }
  59. base_node = base_node->next; // 迭代
  60. }
  61. base_node->next = hn; // 给链表赋值
  62. }
  63. return 0;
  64. }
  65. HashNode *find_node(HashTable *ht, char *key){
  66. // 检查数据是否合法
  67. if(ht == NULL){
  68. return NULL;
  69. }
  70. // 计算索引
  71. unsigned int index = time33(key);
  72. HashNode *base_node = ht->HashNode[index]; // 根据下标拿base节点
  73. if(base_node == NULL){ // 没有节点
  74. return NULL; // 返回NULL表示无数据
  75. }
  76. else{
  77. while(1){
  78. if(!strcmp(base_node->key, key)){ // 比较字符串的值,不可以直接使用 == [char *是指针,==只是比较俩字符串的指针是否一致]
  79. return base_node;
  80. }
  81. else if(base_node->next == NULL){ // 迭代找到最后一个节点,依然没有节点
  82. return NULL;
  83. }
  84. base_node = base_node->next;
  85. }
  86. }
  87. return NULL;
  88. }