验证某个密钥是否在哈希表中

时间:2014-05-06 11:24:02

标签: c hash hashtable

所以,我需要创建一个给定某个哈希表和一个键的函数,验证是否有一个具有相同键的对象。到目前为止,我所拥有的是:

int hash_exists(hash_table td, const char *key)
{
    element *temp = NULL;
    int i = 0;

    if (td == NULL)
        return INVALID_HASHTABLE;

    i = td->hfunc(key, td->size);

    for (i=0; i<td->size;i++)
    {
        temp = td->elements[i];

        while (temp!=NULL)
        {
            if (strcmp(temp->obj->key, key)!)
                return INEXISTENT_HASHTABLE;

            else
                temp = temp->next;
        }
}
    return EXISTING_HASHTABLE;
}

但是,运行测试程序时,它表示当哈希表中没有值时,它必须返回INEXISTENTE_HASHTABLE

BTW,hfunc(key, td->size)返回与字符串/键关联的哈希值。这个问题非常具体,所以请忽略它。和,

typedef struct
{
    char key[KEY_SIZE];
    char value[SIZE_VALUE];
} objet;


typedef struct elem
{
    objet* obj;
    struct elem * next;
} element;


struct hash_table
{
    hash_func *hfunc;
    element **elements;
    int size;
}

typedef struct hash_table *hash_table;

我真的很想知道我做错了什么,如果有人能纠正我的代码,我会很感激。我确实在论坛上寻找可以帮助我的东西,但没有找到任何东西。感谢。

3 个答案:

答案 0 :(得分:0)

您已撤消了返回值。 if条件也需要稍作修改:

int hash_exists(hash_table td, const char *key)
{
    element *temp = NULL;
    int i = 0;

    if (td == NULL)
        return INVALID_HASHTABLE;

    i = td->hfunc(key, td->size);

    for (i=0; i<td->size;i++)
    {
        temp = td->elements[i];

        while (temp!=NULL)
        {
            if (!strcmp(temp->obj->key, key)) {
                return EXISTING_HASHTABLE;     // Key found
            }
            temp = temp->next;
        }
        // Key not found
        return INEXISTENT_HASHTABLE;
    }
}

答案 1 :(得分:0)

试试这个:

int hash_exists(hash_table td, const char *key)
{
    element *temp = NULL;
    int i = 0;

    if (td == NULL)
        return INVALID_HASHTABLE;

    i = td->hfunc(key, td->size);

    for (i=0; i<td->size;i++)
    {
        temp = td->elements[i];

        while (temp!=NULL)
        {
            if (!strcmp(temp->obj->key, key))
                return EXISTING_HASHTABLE;

            else
                temp = temp->next;
        }
}
    return INEXISTENT_HASHTABLE;
}

答案 2 :(得分:0)

int hash_exists(hash_table td, const char *key)
{
    element *temp = NULL;
    int i; // should be unsigned

    if (td == NULL)
        return INVALID_HASHTABLE;

    i = td->hfunc(key, td->size);

    for (temp = td->elements[i]; temp; temp = temp->next) {
            if ( !strcmp(temp->obj->key, key)) return EXISTING_HASHTABLE;    
            }
    return INEXISTENT_HASHTABLE;
}