Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 具有链接方法程序的哈希表未按预期工作_C_Data Structures_Hash_Hashmap_Hashtable - Fatal编程技术网

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

我正在使用链表链接方法在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;
   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);
}