c - C中Hashtable的插入函数

标签 c data-structures hash hashtable hashcode

所以,我有这些功能。如何在 Hashtable 中插入数字?一直到表格大小的 for?我不知道 for 里面有什么,如果它存在的话。

#include <stdio.h>

//Structure
typedef struct Element {
    int key;
    int value;
} Element;

typedef struct HashTable {
    Element *table[11];
} HashTable;


//Create an empty Hash
HashTable* createHashTable() {
    HashTable *Raking = malloc(sizeof(HashTable));

    int i;
    for (i = 0; i < 11; i++) {
        Raking->table[i] = NULL;
    }
    return Raking;
}

//Insert element
void insertElement(HashTable *Raking, int key, int value) {

    int h = hashFunction(key);

    while(Raking->table[h] != NULL) {

        if(Raking->table[h]->key == key) {
            Raking->table[h]->value = value;
            break;
        }

        h = (h + 1) % 11;
    }

    if(Raking->table[h] == NULL) {
        Element *newElement = (Element*) malloc(sizeof(Element));
        newElement->key = key;
        newElement->value = value;
        Raking->table[h] = newElement;
    }
}

int main() {

    HashTable * Ranking = createHashTable();


    /** ??? **/


}

有人可以向我解释如何使用这些结构编写我的主要功能吗?在这种情况下,我正在修复此表中的元素数量,对吗? (表 [11]) 我可以为用户做些什么来确定哈希表的大小?是否可以?还是我应该设置尺寸?

最佳答案

我已经对您的代码添加了注释和更改,我认为它们对您有用。我还对其进行了调整,以便不对大小进行硬编码。最后,我释放了所有 malloc 编辑的语句。

编译没有错误,我使用 valgrind 测试了它是否存在内存泄漏和其他错误,没有发现任何投诉。

如果有什么不清楚或者评论无法解释的地方,请告诉我。我已尝试尽可能多地遵循您的代码,但我没有机会正确测试功能。

#include <stdio.h>
#include <stdlib.h>

//Structure
typedef struct Element {
    int key;
    int value;
} Element; /* you had a syntax error here */

typedef struct HashTable {
    int size; /* we will need the size for the traversal */
    Element *table; /* leave it as a pointer */
} HashTable; /* a syntax error here too */

HashTable* createHashTable(int size) {
    HashTable *Ranking = malloc(sizeof(HashTable));

    /* set the pointer to point to a dynamic array of size 'size' */
    /* this way you don't have to hardcode the size */
    Ranking->table = malloc(sizeof(Element) * size); 
    Ranking->size = size;

    /* initialisation is a bit different because we don't have pointers here */
    /* only table is a pointer, not its elements */
     int i;
     for (i = 0; i < size; i++) {
         Ranking->table[i].key = 0; 
         Ranking->table[i].value = 0;
     }

    return Ranking;
}

/* I implemented a fake hashFunction just to test the code */
/* all it does is make sure the key does not exceed the size of the table */
int hashFunction(int key, int size)
{
    return (key % size);
}

//Insert element
void insertElement(HashTable *Ranking, int key, int value) {

    int h = hashFunction(key, Ranking->size);
    int i = 0;

    /* if hash is full and key doesn't exist your previous loop would have gone on forever, I've added a check */
    /* also notice that I check if table[h] has empty key, not if it's null as this is not a pointer */
    while(Ranking->table[h].key != 0 && (i < Ranking->size)) {

        if(Ranking->table[h].key == key) {
            Ranking->table[h].value = value;
            return; /* break is intended to quit the loop, but actually we want to exit the function altogether */
        }

        h = (h + 1) % Ranking->size; /* changed 11 to the size specified */
        i++; /* advance the loop index */
    }

    /* okay found a free slot, store it there */
    if(Ranking->table[h].key == 0) {
        /* we now do direct assignment, no need for pointers */
        Ranking->table[h].key = key;
        Ranking->table[h].value = value;
    }
}

int main() {

    int size = 0;
    scanf(" %d", &size);

    HashTable *Ranking = createHashTable(size);

    insertElement(Ranking, 113, 10); /* this is just a test, 113 will be hashed to be less than size */

    /* we free everything we have malloc'ed */
    free(Ranking->table);
    free(Ranking);

    return 0;
}

关于c - C中Hashtable的插入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736932/

相关文章:

c - 如何在C中逐字反转句子?

我可以将 malloc 与引用而不是指针一起使用吗?

android - 如何优化在我的 Android 应用程序中加载大量字符串?

arrays - Perl:将数据从哈希转储到 Excel 中

c - 存储类别之间有什么区别

c - openMP:为什么我在使用 "#pragma omp parallel num_threads(4)"时没有得到不同的线程 ID

javascript - 如何使用 ruby​​ 哈希作为 javascript 函数的选项

c# - C# 和 Java 之间始终相等的简单哈希

c - Perl 结构流向 C

c++ - 如何实现尺寸有限的 map