哈希表添加
如有可以改进的地方,欢迎留言
#include <stdio.h>
#include "stdlib.h"
#include "hash.h"
void copy(char* new_str, const char* old_str);
HASH_RESULT hash_add_int(HashTable *table, const char *key, int value ){
if(!key) return HASH_ERROR;
long hash = hash_string(key) % table -> size;
int target = 0;
HashEntry *temp = table->bucket[hash];
while(temp != NULL){
if(!strcmp(temp -> key.str_value , key)){
if(temp -> value.int_value == value){
return HASH_ALREADY_ADDED;
}
else{
temp -> value.int_value = value;
return HASH_REPLACED_VALUE;
}
}
temp = temp -> next;
}
temp = table->bucket[hash];
if(temp == NULL){
HashEntry *hashentry = (HashEntry*)malloc(sizeof(HashEntry));
if(!hashentry){
free(hashentry);
return HASH_ERROR;
}
hashentry -> key.str_value = (char*)malloc(sizeof(key));
copy(hashentry -> key.str_value, key);//也可以把copy改为strcpy,记得加头文件string就行
hashentry -> value.int_value = value;
hashentry -> next = NULL;
table->bucket[hash] = hashentry;
return HASH_ADDED;
}
else{
while(temp -> next != NULL){
temp = temp -> next;
}
HashEntry *hashentry = (HashEntry*)malloc(sizeof(HashEntry));
if(!hashentry){
free(hashentry);
return HASH_ERROR;
}
hashentry -> key.str_value = (char*)malloc(sizeof(key));
copy(hashentry -> key.str_value, key);//也可以把copy改为strcpy,记得加头文件string就行
hashentry -> value.int_value = value;
hashentry -> next = NULL;
temp -> next = hashentry;
return HASH_ADDED;
}
}
void copy(char* new_str, const char* old_str){
while((*old_str) != '\0'){
*new_str++ = *old_str++;
}
*new_str = '\0';
}