Advertisement
vinocastro

ME 4

Nov 9th, 2020 (edited)
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.49 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdbool.h>
  6.  
  7. int power(int base, int exp) {
  8.     if (exp == 0)
  9.         return 1;
  10.     else if (exp % 2)
  11.         return base * power(base, exp - 1);
  12.     else {
  13.         int temp = power(base, exp / 2);
  14.         return temp * temp;
  15.     }
  16. }
  17.  
  18. int f1(int k)
  19. {
  20.     return k % 32;
  21. }
  22.  
  23. int f2(int k)
  24. {
  25.     return ((31*k)%(power(2,11))) >> (11-5);
  26. }
  27.  
  28. int f3(int k)
  29. {
  30.     return ((1731 * k + 520123) % 524287) % 32;
  31. }
  32.  
  33. typedef struct hash_table HASH_TABLE;
  34. typedef struct node NODE;
  35. struct node
  36. {
  37.     int key;
  38.     char *data;
  39.     NODE* link;
  40. };
  41. struct hash_table
  42. {
  43.     NODE* HEAD[32];
  44. };
  45.  
  46. void init(HASH_TABLE* table)
  47. {
  48.     for(int i = 0;i<32;i++)
  49.     {
  50.         table->HEAD[i] = NULL;
  51.     }
  52. }
  53. void insert(HASH_TABLE* table,int k,char* d,int option)
  54. {  
  55.     int i;
  56.     if(option ==  1)
  57.     {
  58.         i = f1(k);
  59.     }
  60.     else if(option == 2)
  61.     {
  62.         i = f2(k);
  63.     }
  64.     else
  65.     {
  66.         i = f3(k);
  67.     }
  68.     NODE* alpha;
  69.     alpha = table->HEAD[i];
  70.     int isDuplicate = 0;
  71.     while (alpha != NULL)
  72.     {
  73.         if(alpha->data == d)
  74.         {
  75.             isDuplicate = 1;
  76.             break;
  77.         }
  78.         else
  79.         {
  80.             alpha = alpha->link;
  81.         }
  82.        
  83.     }
  84.     if (isDuplicate == 0)
  85.     {
  86.         NODE* alpha1;
  87.         alpha1 = malloc(sizeof(NODE));
  88.         alpha1->key = k;
  89.         alpha1->data = d;
  90.         alpha1->link = table->HEAD[i];
  91.         table->HEAD[i] = alpha1;
  92.     }
  93.    
  94.    
  95. }
  96.  
  97. int key_to_num(char *key)
  98. {
  99.     int sum = 0;
  100.     for(int i = 0;i<strlen(key);i++)
  101.     {
  102.         sum += key[i];
  103.     }
  104.     return sum;
  105. }
  106.  
  107. void print_list(NODE* list)
  108. {
  109.     NODE* alpha = list;
  110.     while (alpha != NULL)
  111.     {
  112.         printf("%s ",alpha->data);
  113.         alpha = alpha->link;
  114.     }
  115.     printf("\n");
  116.    
  117. }
  118.  
  119. void print_table(HASH_TABLE* table)
  120. {
  121.     for(int i = 0;i<32;i++)
  122.     {
  123.         printf("%d: ",i);
  124.         print_list(table->HEAD[i]);
  125.     }
  126. }
  127. int main()
  128. {
  129.     int option,n,key;
  130.     scanf("%d",&option);
  131.     scanf("%d",&n);
  132.    
  133.     HASH_TABLE T;
  134.     init(&T);
  135.     char keystring[10];
  136.     char* inputs[n];
  137.     for(int i = 0;i<n;i++)
  138.     {  
  139.         inputs[i] = (char*)malloc(10);
  140.         scanf("%s",inputs[i]);
  141.        
  142.     }
  143.     for(int i = 0;i<n;i++)
  144.     {
  145.         key = key_to_num(inputs[i]);
  146.         insert(&T,key,inputs[i],option);
  147.     }
  148.     print_table(&T);
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement