哈希表的分段错误

时间:2015-11-29 13:45:45

标签: c hash linked-list

我正在尝试更准确地创建一个哈希表,一个链表的数组,我已经使用链接列表的添加功能并且工作正常但是当为哈希表尝试这个时,它会产生分段错误。任何人都知道这是什么问题?

void create_HTable(FILE* book, list* hashTable[1009])
{
  char word[20];
  read(word,book);
  while(strcmp(word,"EOF")!=0)
  {
    int hash_number = hash(word,1009);
    list* node = hashTable[hash_number];
    node = add(node,word);
    read(word, book);
  }
}

list *add(list *old_list, char new_word[20])
{
  //this is a special case when the head of the list is empty
  if(old_list==NULL)
  {
    return insert(new_word,NULL);
  }
  else
  {
    list *new_list = old_list;
    if (doesExist(new_list, new_word, true) == 0)
    {
      while (new_list->next !=NULL)
      {
        new_list = new_list->next;
      }
      new_list->next=insert(new_word,NULL);
    }
    return old_list;
  }
}

这适用于普通链表,但是当我尝试在我的哈希表函数中重用它时,它会崩溃。有谁知道这个问题?感谢

1 个答案:

答案 0 :(得分:0)

您的add函数返回新的列表头。这样:

list* node = hashTable[hash_number];
node = add(node,word);

不会更新哈希表中的头指针。它会将新头部分配给局部变量node,该变量立即超出范围。使用:

hashTable[hash_number] = add(hashTable[hash_number], word);

头节点的重复不是很优雅,很容易忘记存储新的头指针。考虑重写你的add函数,以便第一个参数是指向头指针的指针,然后你可以更新它。

然而,该错误并不能解释分段错误。你有没有把所有1009个头指针NULL投入使用?您的哈希函数是否保证返回0到1008之间的数字?您不会显示散列函数,但您的散列码是有符号整数。使哈希码无符号非常常见,因此算术溢出永远不会产生负数。 (有点令人惊讶的是,(-a) % 1009在C中是否定的。)