Добавление элементов в мою хэш-таблицу в C - PullRequest
0 голосов
/ 04 февраля 2011

Я пытаюсь добавить элемент в мой Hashtable, я использовал много printf, чтобы увидеть, что происходит, но похоже, что он должен добавить его, но на самом деле это не так.:

struct hashnode_s {
    char *key;
    ValueType tag;
    union
    {
        int IntegerValue;
        char *StringValue;
    }u;
    struct hashnode_s *next;
};

Я пытаюсь подражать компилятору GCC.с моей хеш-таблицей

typedef struct hashtbl {
    hash_size size;
    struct hashnode_s **nodes;
    hash_size (*hashfunc)(const char *);
} HASHTBL;

и моим методом вставки

int hashtbl_InsertString(HASHTBL *hashtbl, const char *key, const char *value)
{
    struct hashnode_s *node;
    hash_size hash;

    hash = SearchForHashIndex(hashtbl, key, value);
    if(hash ==-1)
    {
        hash=hashtbl->hashfunc(key);
    }

    fprintf(stderr, "hashtbl_insert() key=%s, hash=%d\n\n\n", key, hash);

    node=hashtbl->nodes[hash];
    while(node)
    {   
        printf("In while\n\n\n\n\n");   
        /* This Code isn't correct 
        if(!strcmp(node->key, key)) {
            node->data=data;
            return 0;
        }*/
        node=node->next;
    }

    if(!(node=malloc(sizeof(struct hashnode_s)))) return -1;
    if(!(node->key=mystrdup(key))) {
        free(node);
        return -1;
    }
    node->key = key;
    node->tag = StringConst;
    node->u.StringValue = value;

    node->next=hashtbl->nodes[hash];    

    printf("ADDING HASH NODE \n\n\n");

    hashtbl->nodes[hash]=node;

    return 0;
}

Я продолжаю получать нулевые значения при поиске метода.Что не должно быть так.Я правильно его вставляю?

int SearchForHashIndex(HASHTBL *hashtbl, const char *key, const char *value)
{
    printf("INSIDE SEARCH FOR HASH INDEX \n\n\n\n\n");
    int i;

    for(i=0; i < CurrentHashSize; i++)
    {   
        struct hashnode_s *node;    
        node = hashtbl->nodes[i];
        printf("%d\n",i);
        if(node == NULL)
        {
            printf("NULL");
        }
        while(node)
        {
            if(strcmp(node->key,key) || strcmp(node->u.StringValue,value))
            {
                printf("INSIDE HERE!\n");
                return i;
                printf("returning %d\n",i);
            }
            node = node->next;
        }
    }
    printf("returning -1\n");
    return -1;
}

Ответы [ 3 ]

4 голосов
/ 04 февраля 2011

Это выглядит не так:

if(!(node->key=mystrdup(key))) {
    free(node);
    return -1;
}
node->key = key;

Вы устанавливаете node->key (очевидно) копию предоставленной key;затем вы немедленно перезаписываете этот указатель аргументом функции, что вряд ли будет правильным.

1 голос
/ 04 февраля 2011

strcmp () возвращает 0 при успешном сравнении.Вам необходимо изменить условие if () в функции поиска.

Кроме того, этот блок в подпрограмме вставки:

node=hashtbl->nodes[hash];
while(node)
{   
    printf("In while\n\n\n\n\n");   
    /* This Code isn't correct 
    if(!strcmp(node->key, key)) {
        node->data=data;
        return 0;
    }*/
    node=node->next;

}

бесполезен, поскольку вы просто назначаете вновь выделенную память узлусразу после этого.

0 голосов
/ 04 февраля 2011

Если ваша хеш-функция надежна (и она должна быть хеш-функцией), вашей поисковой функции не нужно выполнять итерацию по всем связанным спискам.Вам не нужен этот внешний цикл for - просто установите i на hashtabl->hashfunc(key) и найдите этот список для поиска элемента.Если его нет в этом списке, его не должно быть ни в одном списке, а если это так, то ваша функция вставки определенно неверна.

Фактически, ваша функция поиска должна возвращать либо hashtabl->hashfunc(key), либо -1.

Кроме того, что должно произойти, если кто-то использует один и тот же ключ для разных объектов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...