C语言中的哈希表插入/搜索
您好,我的哈希表有问题,其实现方式如下:C语言中的哈希表插入/搜索,c,hashtable,C,Hashtable,您好,我的哈希表有问题,其实现方式如下: #define HT_SIZE 10 typedef struct _list_t_ { char key[20]; char string[20]; char prevValue[20]; struct _list_t_ *next; } list_t; typedef struct _hash_table_t_ { int size; /* the size of the table */
#define HT_SIZE 10
typedef struct _list_t_ {
char key[20];
char string[20];
char prevValue[20];
struct _list_t_ *next;
} list_t;
typedef struct _hash_table_t_ {
int size; /* the size of the table */
list_t ***table; /* first */
sem_t lock;
} hash_table_t;
new_table->table = (list_t ***)calloc(num_shards,sizeof(list_t **));
我有一个带有3个指针的链表,因为我想要一个包含多个分区(碎片)的哈希表,下面是我对哈希表的初始化:
hash_table_t *create_hash_table(int NUM_SERVER_THREADS, int num_shards){
hash_table_t *new_table;
int j,i;
if (HT_SIZE<1) return NULL; /* invalid size for table */
/* Attempt to allocate memory for the hashtable structure */
new_table = (hash_table_t*)malloc(sizeof(hash_table_t)*HT_SIZE);
/* Attempt to allocate memory for the table itself */
new_table->table = (list_t ***)calloc(1,sizeof(list_t **));
/* Initialize the elements of the table */
for(j=0; j<num_shards; j++){
new_table->table[j] = (list_t **)calloc(1,sizeof(list_t *));
for(i=0; i<HT_SIZE; i++){
new_table->table[j][i] = (list_t *)calloc(1,sizeof(list_t ));
}
}
/* Set the table's size */
new_table->size = HT_SIZE;
sem_init(&new_table->lock, 0, 1);
return new_table;
}
和我的插入函数:
char *add_string(hash_table_t *hashtable, char *str,char *key, int shardId){
list_t *new_list;
list_t *current_list;
unsigned int hashval = hash(key);
/*printf("|%d|%d|%s|\n",hashval,shardId,key);*/
/* Lock for concurrency */
sem_wait(&hashtable->lock);
/* Attempt to allocate memory for list */
new_list = (list_t*)malloc(sizeof(list_t));
/* Does item already exist? */
sem_post(&hashtable->lock);
current_list = lookup_string(hashtable, key,shardId);
sem_wait(&hashtable->lock);
/* item already exists, don't insert it again. */
if (current_list != NULL){
strcpy(new_list->prevValue,current_list->string);
strcpy(new_list->string,str);
strcpy(new_list->key,key);
new_list->next = hashtable->table[shardId][hashval];
hashtable->table[shardId][hashval] = new_list;
sem_post(&hashtable->lock);
return new_list->prevValue;
}
/* Insert into list */
strcpy(new_list->string,str);
strcpy(new_list->key,key);
new_list->next = hashtable->table[shardId][hashval];
hashtable->table[shardId][hashval] = new_list;
/* Unlock */
sem_post(&hashtable->lock);
return new_list->prevValue;
}
我的主类通过执行哈希表元素的插入/读取/删除来运行一些测试问题是当我有超过4个分区/碎片时,测试在第一个读取元素处停止,表示它在搜索函数上返回了错误的NULL值,当其小于4时,运行良好,并通过所有测试
如果您想查看,可以在此处查看我的main.c:
我的完整哈希表代码:
以及执行哈希表代码的其他函数:
.c文件
.h文件
感谢您的时间,我感谢您能给我的任何帮助这是一个大学的重要项目,我正在努力解决,我在这里被困了两天。嗨,已经解决了这个问题,我在初始化时做了一个错误的分配:
new_table->table = (list_t ***)calloc(1,sizeof(list_t **));
应该是这样的:
#define HT_SIZE 10
typedef struct _list_t_ {
char key[20];
char string[20];
char prevValue[20];
struct _list_t_ *next;
} list_t;
typedef struct _hash_table_t_ {
int size; /* the size of the table */
list_t ***table; /* first */
sem_t lock;
} hash_table_t;
new_table->table = (list_t ***)calloc(num_shards,sizeof(list_t **));
这是代码部分缺少的另一个链接。这里的三颗星是一个非常常见的习惯用法——它只是一个动态分配和大小的二维数组索引,如“p=table[a][b]”。没什么大不了的。是的,是二维数组,它有三颗星,因为它是一个链接列表