2013-07-19 7 views
0

Итак, у меня есть функции. Как вставить числа в Hashtable? A for, который идет до размера стола? Я не знаю, что происходит внутри for, если оно существует.Вставить функцию Hashtable в C

#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]) Что я могу сделать для пользователя, чтобы определить размер хеш-таблицы? Является ли это возможным? Или я должен установить размер?

+0

не 'хэш-функцию (ключ)' предположим, что '(хэш-функцию Chave)' (или не должны 'chave' быть переведены на' key' в качестве аргумента функции)? это компилируется? – tay10r

+0

Это была ошибка перевода, извините. Уже отредактирован! И нет, еще не компилируется, потому что основная функция недоделана. – U23r

+0

кажется, что вы создали некоторые синтаксические ошибки при переводе. Попробуйте исправить их. Вы также можете показать реализацию хеш-функции, это может быть полезно. – tay10r

ответ

2

Я добавил комментарии и изменения к вашему коду, который, как я считаю, будет вам полезен. Я также адаптировал его так, чтобы размер не был жестко закодирован. Наконец, я освобождаю все операторы 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; 
} 
+1

Могу я предложить функцию с прототипом 'void destroyHashTable (HashTable *);' для сопряжения с 'createHashTable (.)' Вместо прямых вызовов 'free()' в конце 'main()' (увеличение инкапсуляции и уменьшить сцепление)? Кроме того, назовите меня перфекционистом, но «HashTable» createHashTable (int size) 'кричит как« HashTable »createHashTable (size_t size)'. Да, я понимаю (по 32-битной архитектуре int) вам нужно было бы выделить 32 хэш-таблицу Gibibyte для этого. Я сказал, перфекционист. – Persixty