C 具有链接方法程序的哈希表未按预期工作
我正在使用链表链接方法在C中实现哈希表。程序运行,但在搜索条目时,我总是得到结果C 具有链接方法程序的哈希表未按预期工作,c,data-structures,hash,hashmap,hashtable,C,Data Structures,Hash,Hashmap,Hashtable,我正在使用链表链接方法在C中实现哈希表。程序运行,但在搜索条目时,我总是得到结果“Element is not found”,尽管元素在散列中。这篇文章是对我上一篇文章的轻微修改。计划如下: struct llist{ char *s; struct llist *next; }; struct llist *a[100]; void hinsert(char *str){ int strint, hashinp; strint = 0; hashinp = 0
“Element is not found”
,尽管元素在散列中。这篇文章是对我上一篇文章的轻微修改。计划如下:
struct llist{
char *s;
struct llist *next;
};
struct llist *a[100];
void hinsert(char *str){
int strint, hashinp;
strint = 0;
hashinp = 0;
while(*str){
strint = strint+(*str);
str=str+1;
}
hashinp = (strint%100);
if(a[hashinp] == NULL){
struct llist *node;
node = (struct llist *)malloc(sizeof(struct llist));
node->s = str;
node->next = NULL;
a[hashinp] = node;
}
else{
struct llist *node, *ptr;
node = (struct llist *)malloc(sizeof(struct llist));
node->s = str;
node->next = NULL;
ptr = a[hashinp];
while(ptr->next != NULL){
ptr = ptr->next;
}
ptr->next = node;
}
}
void hsearch(char *strsrch){
int strint1, hashinp1;
strint1 = 0;
hashinp1 = 0;
while(*strsrch){
strint1 = strint1+(*strsrch);
strsrch = strsrch+1;
}
hashinp1 = (strint1%100);
struct llist *ptr1;
ptr1 = a[hashinp1];
while(ptr1 != NULL){
if(ptr1->s == strsrch){
cout << "Element Found\n";
break;
}else{
ptr1 = ptr1->next;
}
}
if(ptr1 == NULL){
cout << "Element Not Found\n";
}
}
您的程序是否处于无限循环中?也许用这句话
while(*str){
strint = strint+(*str);
}
您指向
*str
的指针在该循环的作用域中永远不会无效,因此您应该得到一个无限循环。您没有在该循环中推进指针。(这也是一个非常糟糕的哈希函数)
为什么这是一个糟糕的哈希函数?这是我实施的方式吗?我只是好奇。如果有任何建议,我可以改进程序。原因之一是它可能会导致负值。另一个是“abc”和“cba”将散列为相同的值。第三个是循环永远不会结束。@JustinCarrey在网上四处寻找谈论散列字符串或一般散列的人。有很多研究和测试,也有无休止的争论。除非字符串是完全随机的,否则简单的求和将导致散列值的错误分布。我个人已经不再寻找完美的散列函数,而是使用树来存储数据。它更优雅,没有可利用的角落案例,并且在很多情况下在宏基准测试中更快。1)hsearch是库函数的名称。2) 我没有发现错误。我应该分别编写散列函数。如果在insert函数中写入,则在while循环完成后,str将变为“\0”。所以,当我说node->s=str时,“\0”被插入到node->s中。那把一切都搞砸了。再次感谢!!这只是一个失误。还有(至少)四个。但在我纠正它之后,我的程序按照我的预期运行。你能告诉我其他的是什么吗(除了坏的散列函数。它可以完成任务)?我没有使用字符串指针,而是使用strcmp()更改了代码来比较字符串
while(*str){
strint = strint+(*str);
}
while(*str){
strint = strint+(*str);
}