feat: Chaining hash table
This commit is contained in:
parent
69d302d38a
commit
605d9f6dd9
134
hash-table.c
Normal file
134
hash-table.c
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#define TABLE_SIZE 10
|
||||||
|
|
||||||
|
struct Node {
|
||||||
|
char key[48];
|
||||||
|
int value;
|
||||||
|
struct Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
long long hash_function(char *key) {
|
||||||
|
long long hash = 0;
|
||||||
|
for (int i=0; i<strlen(key); i++){
|
||||||
|
hash = ((hash * 33) + key[i]) % TABLE_SIZE;
|
||||||
|
}
|
||||||
|
return hash ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert(struct Node **table, char *key, int value) {
|
||||||
|
long long hash = hash_function(key);
|
||||||
|
|
||||||
|
printf("Hash: %lli\n", hash);
|
||||||
|
|
||||||
|
struct Node *node = malloc(sizeof(struct Node));
|
||||||
|
struct Node *temp, *past;
|
||||||
|
strcpy(node->key, key);
|
||||||
|
node->value = value;
|
||||||
|
node->next = NULL;
|
||||||
|
|
||||||
|
if (table[hash] == NULL){
|
||||||
|
table[hash] = node;
|
||||||
|
printf("Create.\n");
|
||||||
|
} else {
|
||||||
|
printf("Add.\n");
|
||||||
|
temp = table[hash];
|
||||||
|
past = NULL;
|
||||||
|
while(temp != NULL){
|
||||||
|
assert(temp->key != key);
|
||||||
|
printf("%s -> ", temp->key);
|
||||||
|
past = temp;
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
past->next = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void long_to_str(long long num, char *s, int length) {
|
||||||
|
int temp;
|
||||||
|
for (int i=length-1; i>=0; i--) {
|
||||||
|
temp = num % 10;
|
||||||
|
num /= 10;
|
||||||
|
s[i] = (char)(temp + 48);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int search(struct Node **table, char *key) {
|
||||||
|
long long hash = hash_function(key);
|
||||||
|
struct Node *temp, *past;
|
||||||
|
|
||||||
|
if (table[hash] == NULL){
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
temp = table[hash];
|
||||||
|
past = NULL;
|
||||||
|
|
||||||
|
while(temp != NULL){
|
||||||
|
// printf("%s - %s\n", temp->key, key);
|
||||||
|
if (strcmp(temp->key, key) == 0){
|
||||||
|
return temp->value;
|
||||||
|
}
|
||||||
|
past = temp;
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update(struct Node **table, char *key, int value) {
|
||||||
|
long long hash = hash_function(key);
|
||||||
|
struct Node *temp, *past;
|
||||||
|
|
||||||
|
temp = table[hash];
|
||||||
|
past = NULL;
|
||||||
|
while(temp != NULL){
|
||||||
|
if (strcmp(temp->key, key) == 0){
|
||||||
|
temp->value = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
past = temp;
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
struct Node ** table; // pointer to pointer
|
||||||
|
int size;
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
table = malloc(TABLE_SIZE * sizeof(struct Node*));
|
||||||
|
for (int i=0; i<TABLE_SIZE; i++){
|
||||||
|
table[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
long long a = 1234567890;
|
||||||
|
char s[21];
|
||||||
|
for (int i=0; i<50; i++){
|
||||||
|
a = (long long)rand();
|
||||||
|
printf("%lli\n", a);
|
||||||
|
long_to_str(a, s, 20);
|
||||||
|
printf("%s\n", s);
|
||||||
|
insert(table, s, i);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int ans;
|
||||||
|
while (1) {
|
||||||
|
printf("> ");
|
||||||
|
scanf("%lli", &a);
|
||||||
|
printf("HERE\n");
|
||||||
|
long_to_str(a, s, 20);
|
||||||
|
printf("HERE\n");
|
||||||
|
|
||||||
|
update(table, s, 100);
|
||||||
|
ans = search(table, s);
|
||||||
|
printf("%d\n\n", ans);
|
||||||
|
}
|
||||||
|
// long long a = hash_function("9999999999999");
|
||||||
|
// printf("%lli\n", a);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user