Advertisement
allekco

HASH_DONE

May 27th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include <stddef.h>
  7.  
  8. int const a = 1;
  9. int const b = 0;
  10. int const p = 89;
  11. int const m = 15;
  12. int max = 0;
  13. int min = 0;
  14. int max_key = 0;
  15. int min_key = 0;
  16.  
  17. typedef struct node{
  18.     int value;
  19.     int square;
  20.     float radical;
  21.     struct node *next;
  22.     struct node *early;
  23. }node;
  24.  
  25. int search_number (int key){
  26.     int i;
  27.     for (i = 0; i < m; i++){
  28.         if (i==(((a*key + b)% p)% m)){
  29.             return i;
  30.         }  
  31.     }
  32.     return -1;     
  33. }
  34.  
  35. void insert_node (int *A, int key){
  36.     int i = search_number (key);
  37.     node *tmp = (node*) malloc(sizeof(node));
  38.     tmp->value = key;
  39.     tmp->square = key*key;
  40.     tmp->radical = sqrt((float)key);
  41.     if (A[i] == 0){
  42.         A[i] = tmp;
  43.         tmp->next = NULL;
  44.         tmp->early = NULL;
  45.     }
  46.     else{
  47.         node *tmp2;
  48.         tmp2 = A[i];
  49.         A[i] = tmp;
  50.         tmp->next = tmp2;
  51.         tmp2->early = tmp;
  52.     }
  53. }
  54.  
  55. void output_list (int *A, int key){
  56.     int j;
  57.     j = search_number (key);
  58.     if (!A[j]){
  59.         printf ("no elements");
  60.     }
  61.     else{
  62.         node *iter = A[j];
  63.         while (iter != NULL){
  64.             printf ("Value: %d\n", iter->value);
  65.             printf ("The square root of value: %f\n", iter->radical );
  66.             printf ("The square of value: %d\n", iter->square );
  67.             iter = iter->next;
  68.             printf ("\n");
  69.         }
  70.     }
  71. }
  72.  
  73. int search_key (int *A, int key){
  74.     int i, find = -1;
  75.     i = search_number (key);
  76.     node *iter;
  77.     iter = A[i];
  78.     while (iter){
  79.         if (iter->value == key) find = 1;
  80.         iter = iter->next;     
  81.     }
  82.     return find;
  83. }
  84.  
  85. int delete_node (int *A, int key){
  86.    
  87.     int i, done = -1;
  88.     max = 0;
  89.     max_key = 0;
  90.     i = search_number (key);
  91.     node *iter;
  92.     iter = A[i];
  93.     iter->early = NULL;
  94.     while (1){
  95.         if (iter->value == key){
  96.             done = 1;
  97.             break;
  98.         }
  99.         iter = iter->next;         
  100.     }
  101.     node *temporary;
  102.     temporary = iter;
  103.     if ((iter->early == NULL)&&(iter->next == NULL)){ //first element and last
  104.         A[i] = NULL;
  105.         free (temporary);
  106.         return done;   
  107.     }
  108.     if ((iter->early != NULL)&&(iter->next != NULL)){ //in the middle
  109.         node *tmp;
  110.         tmp = iter->next;
  111.         iter->next->early = iter->early;
  112.         iter->early->next = tmp;
  113.         free (temporary);
  114.         return done;
  115.     }
  116.     if ((iter->early == NULL)&&(iter->next != NULL)){
  117.         A[i] = iter->next;
  118.         iter->next = NULL;
  119.         free (temporary);  
  120.         return done;
  121.     }
  122.     if ((iter->early != NULL)&&(iter->next == NULL)){
  123.         iter->early->next = NULL;
  124.         free (temporary);
  125.         return done;
  126.     }
  127. }
  128.  
  129. void max_list (int *A){
  130.     node *iter;
  131.     int i, count;
  132.     for (i = 0; i < m; i++){
  133.         iter = A[i];
  134.         count = 0; 
  135.         if (iter != NULL){
  136.             while (1){
  137.                 count ++;
  138.                 if (iter->next == NULL)
  139.                     break;
  140.                 iter = iter->next;         
  141.             }
  142.             if (max < count){
  143.                 max = count;
  144.                 max_key = iter->value;
  145.             }  
  146.         }
  147.     }
  148. }
  149.  
  150. void min_list (int *A){
  151.     node *iter;
  152.     min = max;
  153.     min_key = max_key;
  154.     int i, count;
  155.     for (i = 0; i < m; i++){
  156.         iter = A[i];
  157.         count = 0; 
  158.         if (iter != NULL){
  159.             while (1){
  160.                 count ++;
  161.                 if (iter->next == NULL)
  162.                     break;
  163.                 iter = iter->next;         
  164.             }
  165.             if (min > count){
  166.                 min = count;
  167.                 min_key = iter->value;
  168.             }  
  169.         }
  170.         else{
  171.             min = 0;
  172.             min_key = -1;
  173.             printf ("u have empty line i = %d\n", i);
  174.             i = m;
  175.         }  
  176.     }
  177. }
  178.  
  179. int main (void){
  180.     int count = 30;
  181.     int number, key, key2, i;
  182.     int *A[m];
  183.    
  184.     for (i = 0; i < m; i++){
  185.         A[i] = NULL;
  186.     }
  187.    
  188.     FILE *mf;
  189.     printf ("opening file :");
  190.     mf = fopen ("C:\\Users\\Anna\\Documents\\ci\\hash.dat","r+");
  191.     if (mf == NULL)
  192.         printf ("error\n");
  193.     else printf ("done\n");
  194.    
  195.     for (i = 0; i < count; i++){
  196.         fscanf(mf, "%d %d", &number, &key);
  197.         printf ("%d\n", key);  
  198.     //  printf ("%d\n", j);
  199.         insert_node (A, key);
  200.     }
  201.     printf ("\n");
  202.  
  203.     int variety, search;
  204.     int behavior = 1;
  205.     while (behavior){
  206.         printf ("Choose what u want:\n1-Add data\n2-Search key \n3-Delete key\n4-Watch on minimal, maximal, average of list\n0-If you want stop this\n");
  207.         printf ("Your choice: ");
  208.         scanf ("%d", &variety);
  209.         switch (variety){
  210.         case 1:
  211.             count++;
  212.             printf ("Input key, what we want insert: ");
  213.             scanf ("%d", &key);
  214.             insert_node (A, key);
  215.             printf ("let's see what lye in A if key = %d\n", key);
  216.             output_list (A, key);
  217.             break;
  218.         case 2:
  219.             printf ("Input key, which we search: ");
  220.             scanf ("%d", &key);
  221.             search = search_key (A, key);
  222.             if (search == -1){
  223.                 printf ("no this key in hash-table\n");
  224.             }  
  225.             else {
  226.                 printf ("U have this key in hash-table\n");
  227.                 output_list (A, key);
  228.             }
  229.             break;
  230.         case 3:
  231.             printf ("Input key, which delete: ");
  232.             scanf ("%d", &key2);
  233.             search = search_key(A, key2);
  234.             if (search == -1){
  235.                 printf ("no this key in hash-table\n");
  236.             }  
  237.             else {
  238.                 int del;
  239.                 del = delete_node (A, key2);
  240.                 if (del == -1){
  241.                     printf ("Error. This element wasn't deleted\n");
  242.                 }
  243.                 else {
  244.                     count--;
  245.                     printf ("Good job. Element was deleted\n");
  246.                 }
  247.             }  
  248.             break;
  249.         case 4:
  250.             max_list (A);
  251.             min_list (A);
  252.             printf ("Max lengh of list %d, this is for this key %d\n", max, max_key);
  253.             printf ("Min lengh of list %d, this is for this key %d\n", min, min_key);
  254.             float average;
  255.             average = (float)count/(float)m;
  256.             printf ("Average lengh of list %f\n", average);
  257.             break;
  258.         case 0:
  259.             behavior = 0;
  260.             break;
  261.         default:
  262.             printf("Wrong input\n" );
  263.             break;
  264.         }
  265.     }
  266.     fclose (mf);
  267.     printf ("file closed\n");
  268.     return 0;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement