当前位置: 首页 > 知识库问答 >
问题:

在哈希表中插入节点

东门宜
2023-03-14

下面的代码是正确的,但我不明白为什么两行代码可以工作。我指的是最后一块。具体地说,我指的是这两行:

newword->next=hashtable[index];
hashtable[index]=newword;

如果目标是在哈希表的索引处将节点追加到链表,那么为什么newword->next指向哈希表的索引,而该索引处可能已经有节点了。我认为它应该是newword->next=NULL,因为该节点将是链表中的最后一个链接,因此应该指向NULL。从代码来看,结构的“Next”字段似乎在引用索引。我希望我说得有道理。/***将字典加载到内存中。如果成功,则返回true,否则为false。*/

bool load(const char* dictionary)
{
    // TODO
    // opens dictionary
    FILE* file = fopen(dictionary, "r");
    if (file == NULL)
        return false;

// create an array for word to be stored in
char word[LENGTH+1];

// scan through the file, loading each word into the hash table
while (fscanf(file, "%s\n", word)!= EOF)
{
    // increment dictionary size
    dictionarySize++;

    // allocate memory for new word 
    node* newWord = malloc(sizeof(node));

    // put word in the new node
    strcpy(newWord->word, word);

    // find what index of the array the word should go in
    int index = hash(word);

    // if hashtable is empty at index, insert
    if (hashtable[index] == NULL)
    {
        hashtable[index] = newWord;
        newWord->next = NULL;
    }

    // if hashtable is not empty at index, append
    else
    {
        newWord->next = hashtable[index];
        hashtable[index] = newWord;
    }      
}

共有1个答案

薛宇
2023-03-14

您认为新节点被追加到末尾的假设是错误的。代码将新节点插入链表的前面,有效地使其成为新的头。“尾巴”是旧单子,它的头部现在是新头部之后的节点。

这样的插入速度更快,因为你不必走完列表才能找到结尾。节点的顺序在这里无关紧要。

您甚至不需要if(Hashtable[index]==NULL)中的区分;您可以将这两种情况折叠为一个,即else子句中的代码。

 类似资料:
  • 我试图做一个哈希表与线性探测插入。 表的大小是11,我的散列函数是,h(k)=k mod 11,我想做的是。 插入(15, c)插入(4, a)插入(26, b)删除(15)插入(5, d)插入(4, e) 这是我的解决方案,但它是不对的。 应该是这样的,有人能解释一下为什么吗?

  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 我在研究hackerearth上的哈希表,在那里我遇到了用线性探测实现哈希表的代码。我对这段代码有两个疑问:- 1)为什么他们声明大小为21(而不是大小为20)的hashTable最多容纳20个元素? 2) 在Insert函数中,当循环无限运行时,如果在连续迭代之后,索引的值变为索引的初始值,不是吗? 链接至黑客主页:-https://www.hackerearth.com/practice/da

  • 我试图使用Datastax驱动程序将作为<code>int、time、hash</code>提供的值存储到Cassandra中。 哈希显示为< code>{ "Q17.1_4"= 已将表定义为: 整数 时间戳 地图 PK(int,时间戳) 我可以把PK插入ok,但是我很难把哈希值强制转换成Cassandra可以处理的东西。 创建了一个准备好的语句,并在(尝试)遍历值时使用它: 如果我将“val”作

  • 长度为10的哈希表使用带有哈希函数h(k)=k mod 10的开放寻址和线性探测。在向空哈希表中插入8个值后,该表如下所示 使用同一哈希函数和线性探测的键值的多少个不同插入序列将产生如上所示的哈希表? 答案是128。 我知道91,2,13,24,77是5!=120但我不知道其他8种组合是什么?

  • 哈希表 通过最简单的取模运算作为哈希算法 class HashNode(object): def __init__(self, id, data): self.id = id self.data = data self.next = None def __str__(self): return '(%d,%s)' %