Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdint.h>
- #include <stdbool.h>
- int power(int base, int exp) {
- if (exp == 0)
- return 1;
- else if (exp % 2)
- return base * power(base, exp - 1);
- else {
- int temp = power(base, exp / 2);
- return temp * temp;
- }
- }
- int f1(int k)
- {
- return k % 32;
- }
- int f2(int k)
- {
- return ((31*k)%(power(2,11))) >> (11-5);
- }
- int f3(int k)
- {
- return ((1731 * k + 520123) % 524287) % 32;
- }
- typedef struct hash_table HASH_TABLE;
- typedef struct node NODE;
- struct node
- {
- int key;
- char *data;
- NODE* link;
- };
- struct hash_table
- {
- NODE* HEAD[32];
- };
- void init(HASH_TABLE* table)
- {
- for(int i = 0;i<32;i++)
- {
- table->HEAD[i] = NULL;
- }
- }
- void insert(HASH_TABLE* table,int k,char* d,int option)
- {
- int i;
- if(option == 1)
- {
- i = f1(k);
- }
- else if(option == 2)
- {
- i = f2(k);
- }
- else
- {
- i = f3(k);
- }
- NODE* alpha;
- alpha = table->HEAD[i];
- int isDuplicate = 0;
- while (alpha != NULL)
- {
- if(alpha->data == d)
- {
- isDuplicate = 1;
- break;
- }
- else
- {
- alpha = alpha->link;
- }
- }
- if (isDuplicate == 0)
- {
- NODE* alpha1;
- alpha1 = malloc(sizeof(NODE));
- alpha1->key = k;
- alpha1->data = d;
- alpha1->link = table->HEAD[i];
- table->HEAD[i] = alpha1;
- }
- }
- int key_to_num(char *key)
- {
- int sum = 0;
- for(int i = 0;i<strlen(key);i++)
- {
- sum += key[i];
- }
- return sum;
- }
- void print_list(NODE* list)
- {
- NODE* alpha = list;
- while (alpha != NULL)
- {
- printf("%s ",alpha->data);
- alpha = alpha->link;
- }
- printf("\n");
- }
- void print_table(HASH_TABLE* table)
- {
- for(int i = 0;i<32;i++)
- {
- printf("%d: ",i);
- print_list(table->HEAD[i]);
- }
- }
- int main()
- {
- int option,n,key;
- scanf("%d",&option);
- scanf("%d",&n);
- HASH_TABLE T;
- init(&T);
- char keystring[10];
- char* inputs[n];
- for(int i = 0;i<n;i++)
- {
- inputs[i] = (char*)malloc(10);
- scanf("%s",inputs[i]);
- }
- for(int i = 0;i<n;i++)
- {
- key = key_to_num(inputs[i]);
- insert(&T,key,inputs[i],option);
- }
- print_table(&T);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement