思路:
文章给出的hash_string只是一个函数 不需要理解 直接拿来用就可以了 库函数还是用string 首先开一个基本单元HashEntry * p 然后调用函数对输入的key进行解密 注意hash表特性要除以size;然后判断情况,如果没有该entry 就为p开拓一个空间 然后为里面的所有带指针的地方开辟内存 然后同strcpy吧key复制到key.str_value里面 再把value赋值进去 给int然后将表头放置第一个元素p返回ADDED;
第二种情况是已经有了表头 先让p等于最开始的表头 然后用循环来一直往后走 如果key解码函数翻译出来跟p所指的value相等(用strcmp)并且int也相等则返回ALREADYADEDE 如果int不相等就replace 如果一直不相等 就到最后去p停留在最后一个上(不是NULL)再新开一个q用p把q接入链表就可以了
#include <stdio.h>
#include "stdlib.h"
#include "hash.h"
#include <string.h>
HASH_RESULT hash_add_int(HashTable *table, const char*key,int value){
HashEntry* p;//可以理解为等价类
int h=hash_string(key)%table->size;
if(!table->bucket[h]){
p=(HashEntry*)malloc(sizeof(HashEntry));
if(!p)return HASH_ERROR;
p->key.str_value=(char*)malloc(strlen(key));
if(!p->key.str_value)return HASH_ERROR;
strcpy(p->str_value,key);
p->value.int_value=value;
p->next=NULL;
table->bucket[h]=p;
return HASH_ADDED;
}
p=table->bucket[h];
while(p){if(strcmp(key,p->key.str_value)==0){
if(p->value.int_value==value)
return HASH_ALREADY_ADDED;
else {p->value.int_value=value;
return HASH_REPLACED_VALUE;
}
}
else{if(p->next)p=p->next;
else break;
}
}
HashEntry *q;
q=(HashEntry*)malloc(sizeof(HashEntry));
if(!q)return HASH_ERROR;
q->key.str_value=(char *)malloc(strlen(key);
if(!q->key.str_value)return HASH_ERROR;
strcpy(q->key.str_value,key);
q->value,int_value=value;
q->next=NULL;
p->next=q;
return HASH_ADDED;
}