2013-07-19 1 views
0

그래서, 나는 기능이 있습니다. Hashtable에 숫자를 삽입하려면 어떻게해야합니까? 테이블의 크기까지가는 for? for이있는 경우 어떤 내용이 들어 있는지 알 수 없습니다.C에서 Hashtable의 삽입 기능

#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(); 


    /** ??? **/ 


} 

누군가이 구조로 내 주요 기능을 쓰는 방법을 설명해 주시겠습니까? 이 경우이 테이블의 요소 수를 수정합니다. 맞습니까? (table [11]) 사용자가 해시 테이블의 크기를 결정하기 위해 무엇을 할 수 있습니까? 그것은 가능한가? 또는 크기를 설정해야합니까?

+0

는'hashFunction (키) 아니다''hashFunction (chave를) '로 가정 (또는'함수 인수에 key''로 번역 할 chave' 안)? 이 컴파일합니까? – tay10r

+0

번역 오류입니다. 죄송합니다. 이미 편집했습니다! 그리고 주요 기능이 완료되지 않았기 때문에 아직 컴파일하지 않습니다. – U23r

+0

번역하는 동안 구문 오류가 발생했습니다. 문제를 해결하십시오. 해시 함수에 대한 구현을 보여줄 수도 있습니다. 유용 할 수 있습니다. – tay10r

답변

2

내가 사용하게 될 것으로 생각되는 코드에 대한 의견 및 변경 사항을 추가했습니다. 또한 크기를 하드 코드하지 않도록 적응했습니다. 마지막으로 모든 malloc -ed 문을 해제합니다.

이 코드는 오류없이 컴파일되며 메모리 누수 및 기타 오류 (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

'main()'의 끝에서'free()'를 직접 호출하는 대신'createHashTable (.)'과 쌍을 이루는 prototype'void destroyHashTable (HashTable *); 커플 링 감소)? 또한 완벽 주의자라고 부르지 만,'HashTable * createHashTable (int size)'는'HashTable * createHashTable (size_t size)'가되기 위해 울부 짖습니다. 네, 32 비트 int 아키텍처에서 32 비트 기가비트 해시 테이블을 할당해야한다는 것을 알고 있습니다. 나는 완벽 주의자를 말했다. – Persixty