Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct cell
  5. {
  6. int key;
  7. int status;
  8. } Cell;
  9.  
  10. enum { FREE, OCCUPIED };
  11.  
  12. void afisare(Cell *T, int m)
  13. {
  14. printf("\n\nTabela de dispersie este \n");
  15. for (int i = 0; i < m; i++)
  16. {
  17. if(T[i].status == OCCUPIED)
  18. printf("T[%d]=%d\n",i,T[i]);
  19. else
  20. printf("T[%d]= --\n",i);
  21. }
  22. }
  23.  
  24. void insert_key(int k, Cell *T, int m, int (*hash_func)(int k, int m, int i))
  25. {
  26. int i;
  27. for(i=0;i<m;i++)
  28. {
  29. int h=hash_func(k,m,i);///retinem valoarea(pozitia) returnata de :linear/quadric probing sau double hashing
  30. if(T[h].status==FREE)
  31. {
  32. T[h].key=k;
  33. T[h].status=OCCUPIED;
  34. return;
  35. }
  36. }
  37. }
  38.  
  39. void delete_key(int k, Cell* T, int m, int (*hash_func)(int k, int m, int i)){
  40.  
  41. int i;
  42. for (i=0;i<m;i++){
  43. int h = hash_func(k, m, i);
  44. if(T[h].key ==k)
  45. {
  46. T[h].status = FREE;
  47. return;
  48. }
  49. }
  50.  
  51. }
  52.  
  53. int h_prime(int k, int m)
  54. {
  55. return 0;
  56. }
  57.  
  58. //returneaza pozitia la care se va verifica tabela de dispersie folosind verificarea liniara
  59. int linear_probing(int k, int m, int i)
  60. {
  61. return (k+i)%m;
  62. }
  63.  
  64. int quadratic_probing(int k, int m, int i)
  65. {
  66. return (k+i+i*i)%m;
  67. }
  68.  
  69. int double_hashing(int k, int m, int i)
  70. {
  71. int nr=1;
  72. int j;
  73. for(j=0; j<k; j++)
  74. nr = nr*2;
  75.  
  76. return (k + i*nr)%m;
  77. return 0;
  78.  
  79. }
  80.  
  81. void set_table_free(Cell *T, int m)
  82. {
  83. //initializam tabela
  84. int i;
  85. for (i = 0; i<m; i++)
  86. {
  87. T[i].status = FREE;
  88. }
  89. }
  90.  
  91. int main()
  92. {
  93. int m = 7;
  94. Cell *T = (Cell*) malloc(m*sizeof(Cell)); //tabela de dispersie - se aloca
  95.  
  96. //test linear probing
  97. set_table_free(T, m);
  98. int vals[] = {19, 36, 5, 21, 4, 26, 14, 17};
  99. for(int i=0; i<sizeof(vals)/sizeof(int); i++)
  100. insert_key(vals[i], T, m, linear_probing);
  101. afisare(T, m);
  102. //21, 36, 26, 14, 4, 19, 5
  103.  
  104. //test quadratic probing
  105. set_table_free(T, m);
  106. for(int i=0; i<sizeof(vals)/sizeof(int); i++)
  107. insert_key(vals[i], T, m, quadratic_probing);
  108. afisare(T, m);
  109. //k + i + i*i mod m: 19, 36, 5, 4, 21, 26, 14
  110.  
  111. //test double hashing
  112. set_table_free(T, m);
  113. for(int i=0; i<sizeof(vals)/sizeof(int); i++)
  114. insert_key(vals[i], T, m, double_hashing);
  115. afisare(T, m);
  116. //k + i*2^k mod m: 21, 36, 5, 14, 4, 19, 26
  117.  
  118.  
  119. //test hash function
  120. insert_key(100000, T, m, double_hashing);
  121. afisare(T, m);
  122. insert_key(-3, T, m, linear_probing);
  123. afisare(T, m);
  124. free(T);
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement