Advertisement
Misipuk

KP___2

May 2nd, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <time.h>
  5.  
  6. #define N 227
  7. #define N1 100
  8. #define GR 31000
  9.  
  10.  
  11. typedef struct{
  12.     int key;
  13. }item;
  14.  
  15. typedef struct MyList{
  16.     item * it;
  17.     struct MyList * next;
  18.     struct MyList * prev;
  19. }List;
  20.  
  21. typedef struct{
  22.     int n;
  23.     item ** array;
  24. }AdrHashT;
  25.  
  26. typedef struct{
  27.     int n;
  28.     List ** array;
  29. }HashC;
  30.  
  31. List* addL(List * head, item * it);
  32. List* delL(List * head, item * it);
  33. item * searchL(List * head, int key);
  34.  
  35. void adr_In(AdrHashT * T);
  36. item * adr_Search(AdrHashT * T, int key);
  37. int adr_Ins(AdrHashT * T, item * it);
  38. void adr_Del(AdrHashT * T, item * it);
  39.  
  40.  
  41. void c_In(HashC * T, int n);
  42. item * c_Search(HashC * T, int key);
  43. void c_Ins(HashC * T, item * it);
  44. void c_Del(HashC * T, item * it);
  45.  
  46.  
  47. int h(int key, int div);
  48. void getP();
  49. void showP(int div);
  50.  
  51. int minC = 1000, maxC = 0, minS = 1000, maxS = 0, midC = 0, midS = 0;
  52.  
  53. int cmp = 0;
  54.  
  55. int swap = 0;
  56.  
  57. int main()
  58. {
  59.     srand(time(0));
  60.     int mas[N], i;
  61.  
  62.  
  63.     AdrHashT * daT = (AdrHashT *)malloc(sizeof(AdrHashT));
  64.     adr_In(daT);
  65.     int sizeT = sizeof(AdrHashT) + sizeof(item[GR]);
  66.     for(i = 0; i < N; i++){
  67.         item * it = (item *)malloc(sizeof(item));
  68.         while(1){
  69.             mas[i] = rand() % GR;
  70.             it->key = mas[i];
  71.             if(adr_Ins(daT, it))break;
  72.         }
  73.         getP();
  74.     }
  75.     printf("Direct adressing:\nHash table size: %d byte; Extra memory 0 byte\nAdding:\n", sizeT);
  76.     showP(N);
  77.  
  78.     for(i = 0; i < N; i++){
  79.         item * it = adr_Search(daT, mas[i]);
  80.         getP();
  81.     }
  82.     printf("Search:\n");
  83.     showP(N);
  84.  
  85.     for(i = 0; i < N; i++){
  86.         item * it = adr_Search(daT, mas[i]);
  87.         adr_Del(daT, it);
  88.  
  89.         getP();
  90.     }
  91.     printf("Delete:\n");
  92.     showP(N);
  93.  
  94.     HashC * chT = (HashC *)malloc(sizeof(HashC));
  95.     c_In(chT, N);
  96.     sizeT = sizeof(HashC)+ sizeof(List)*N + sizeof(item)*N;///SIZE
  97.     int sizeD = sizeof(List)*N;
  98.     for(i = 0; i < N; i++){
  99.         item * it = (item *)malloc(sizeof(item));
  100.         mas[i] = rand() % GR;
  101.         it->key = mas[i];
  102.         c_Ins(chT, it);
  103.         getP();
  104.     }
  105.     printf("Method Lanc:\nHash table size: %d bytes;  Extra memory %d bytes\nAdded:\n", sizeT, sizeD);
  106.     showP(N);
  107.  
  108.     for(i = 0; i < N; i++){
  109.         item * it = c_Search(chT, mas[i]);
  110.         getP();
  111.     }
  112.     printf("Search:\n");
  113.     showP(N);
  114.  
  115.     for(i = N-1; i >=0; i--){
  116.         item * it = c_Search(chT, mas[i]);
  117.         c_Del(chT, it);
  118.  
  119.         getP();
  120.     }
  121.     printf("Delete:\n");
  122.     showP(N);
  123.     free(chT);
  124.  
  125.     HashC * chTN = (HashC *)malloc(sizeof(HashC));
  126.     c_In(chTN, N1);
  127.     sizeT = sizeof(HashC)+ sizeof(List)*N1 + sizeof(item)*N1;///SIZE
  128.     sizeD = sizeof(List)*N1;
  129.     for(i = 0; i < N1; i++){
  130.         item * it = (item *)malloc(sizeof(item));
  131.         mas[i] = rand() % GR;
  132.         it->key = mas[i];
  133.         c_Ins(chTN, it);
  134.         getP();
  135.     }
  136.     printf("Method Lanc 100:\nHash table size: %d bytes;  Extra memory %d bytes\nAdded:\n", sizeT, sizeD);
  137.     showP(N1);
  138.  
  139.     for(i = 0; i < N1; i++){
  140.         item * it = c_Search(chTN, mas[i]);
  141.         getP();
  142.     }
  143.     printf("Search:\n");
  144.     showP(N1);
  145.  
  146.     for(i = N1-1; i >=0; i--){
  147.         item * it = c_Search(chTN, mas[i]);
  148.         c_Del(chTN, it);
  149.  
  150.         getP();
  151.     }
  152.     printf("Delete:\n");
  153.     showP(N1);
  154.     return 0;
  155. }
  156.  
  157.  
  158. void adr_In(AdrHashT * T){
  159.     T->n=GR;
  160.     T->array =(item *)malloc(sizeof(item[T->n]));
  161.     int i;
  162.     for(i = 0; i < T->n; i++){
  163.         T->array[i]=NULL;
  164.     }
  165. }
  166. item * adr_Search(AdrHashT * T, int key){
  167.     return T->array[key];
  168. }
  169.  
  170. int adr_Ins(AdrHashT * T, item * it){
  171.     cmp++;
  172.     if(T->array[it->key] == NULL){
  173.         swap++;
  174.         T->array[it->key] = it;
  175.         return 1;
  176.     }
  177.     return 0;
  178. }
  179. void adr_Del(AdrHashT * T, item * it){
  180.     swap++;
  181.     T->array[it->key] = NULL;
  182. }
  183.  
  184. void c_In(HashC * T, int n){
  185.     T->n = n;
  186.     T->array =(List *)malloc(sizeof(List[T->n]));
  187.     int i;
  188.     for(i = 0; i < T->n; i++){
  189.         T->array[i]=NULL;
  190.     }
  191. }
  192. item * c_Search(HashC * T, int key){
  193.     return searchL(T->array[h(key, T->n)], key);
  194. }
  195.  
  196. void c_Ins(HashC * T, item * it){
  197.     swap++;
  198.     T->array[h(it->key, T->n)] = addL(T->array[h(it->key, T->n)], it);
  199. }
  200. void c_Del(HashC * T, item * it){
  201.     swap++;
  202.     T->array[h(it->key, T->n)] = delL(T->array[h(it->key, T->n)], it);
  203. }
  204.  
  205. int h(int it, int div){
  206.     return it % div;
  207. }
  208.  
  209.  
  210. List * addL(List * head, item * it){
  211.     List * tmp = head;
  212.     List * list = (List *)malloc(sizeof(List));
  213.     swap+=2;
  214.     list->it = it;
  215.     list->next = NULL;
  216.     cmp++;
  217.     if(head == NULL){
  218.         swap+=2;
  219.         head = list;
  220.         list->prev = NULL;
  221.     }
  222.     else{
  223.         while(tmp->next != NULL){
  224.             cmp++;
  225.             swap++;
  226.             tmp = tmp->next;
  227.  
  228.         }
  229.         cmp++;
  230.         swap+=2;
  231.         tmp->next = list;
  232.         list->prev = tmp;
  233.     }
  234.     return head;
  235. }
  236. List* delL(List * head, item * itm){
  237.     List * tmp, * temp = head;
  238.     cmp++;
  239.     if(head->it->key == itm->key){
  240.         swap+=3;
  241.         tmp = head;
  242.         head = head->next;
  243.         if(head != NULL)head->prev = NULL;
  244.         free(tmp);
  245.     }
  246.     else{
  247.         while(temp->next != NULL){
  248.             cmp += 2;
  249.             if((temp->next)->it->key == itm->key){
  250.                 swap+=3;
  251.                 tmp = temp->next;
  252.                 if (tmp->next!=NULL) tmp->next->prev = temp;//???
  253.                 temp->next = tmp->next;
  254.                 free(tmp);
  255.                 break;
  256.             }
  257.             swap++;
  258.             temp = temp->next;
  259.         }
  260.         cmp++;
  261.     }
  262.     return head;
  263. }
  264. item * searchL(List * head, int key){
  265.     while(head != NULL){
  266.         cmp+=2;
  267.         if(head->it->key == key){
  268.             return head->it;
  269.         }
  270.         head = head->next;
  271.         swap++;
  272.     }
  273.     cmp++;
  274.     return NULL;
  275. }
  276.  
  277. void showP(int div){
  278.     printf("Sravn:\t min: %d,   mid: %.2f,   max: %d\n", minC, (double)midC/div, maxC);
  279.     printf("Copy:\t min: %d,   mid: %.2f,   max: %d\n\n", minS, (double)midS/div, maxS);
  280.     minC = minS = 1000;
  281.     maxC = maxS = midC = midS = 0;
  282. }
  283.  
  284. void getP(){
  285.     midC += cmp;
  286.     if(minC > cmp)minC = cmp;
  287.     if(maxC < cmp)maxC = cmp;
  288.  
  289.     midS += swap;
  290.     if(minS > swap)minS = swap;
  291.     if(maxS < swap)maxS = swap;
  292.  
  293.     cmp = swap = 0;
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement