哈希表在c?

时间:2015-09-12 15:37:48

标签: c data-structures hashtable

问题来自c,数据结构和算法分析一书。在谈论哈希表时,作者显示了这样的发现函数:

Positon find(ElementType Key,HashTable H)
{
    Position CurrentPos;
    int CollisionNum;
    CollisionNum=0;
    CurrenPos=Hash(Key,T->TableSize)
    while(H->TheCells[CurrentPos].info!=Empty&&H->TheCells[CurrentPos].Element!=key)
    {
        CurrentPos+=2*++CollisionNum-1;
        if(CurrentPos>=H->TableSize)
            CurrentPos-=H->TableSize;
    }
    return CurrentPos;
}

作者说while句中的判断条件的顺序,

H->TheCells[CurrentPos].info!=Empty && H->TheCells[CurrentPos].Element!=key

非常重要,不应该交换。但我不知道为什么。我试图交换订单,但功能仍然正常。如果我更换订单会发生什么错误?

2 个答案:

答案 0 :(得分:1)

如果没有进一步的细节,我的猜测是如果H->TheCells[CurrentPos].infoEmpty,那么H->TheCells[CurrentPos].Element没有意义(可能没有初始化?),因此评估它会导致错误。

这是这种模式的一个(有点愚蠢/极端)的例子:

char *dst = NULL;
if (dst != NULL && memcpy(dst, "foo", strlen("foo" +1))) // this is OK
    // do stuff
memcpy(dst, "foo", strlen("foo" +1)); // segfault here!!!

这是一些(不那么愚蠢)伪代码来获得这个想法:

if (something.has_a_value == true && something.value == value_I_look_for)
    // then proceed

答案 1 :(得分:1)

假设您编写了多个条件,例如condition1 && condition2 && ...。这些是从左到右评估的。如果这些条件中的任何一个评估为假,则不会评估右侧的其余条件。

现在您还没有向我们提供有关您的代码中使用的结构的足够信息,但如果.info假设某个单元格的Empty包含.Element似乎是合理的该单元格尚未初始化。

如果我们写

H->TheCells[CurrentPos].info!=Empty && H->TheCells[CurrentPos].Element!=key

然后我们首先检查.Element是否已初始化。只有这样,我们才会继续将其值与key进行比较。如果不是,则永远不会访问.Element

但如果我们写

 H->TheCells[CurrentPos].Element!=key && H->TheCells[CurrentPos].info!=Empty

可能存在问题。假设当前单元格的.Element尚未初始化。第一个条件访问.Element以将其与key进行比较。这可能会导致未定义的行为。