Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. struct TItem {
  7. TItem(string key, string val, TItem* nextHash,TItem* nextOrd, TItem * prevOrd)
  8. :m_Key(key),m_Val(val),m_NextHash(nextHash),m_NextOrder(nextOrd),m_PrevOrder(prevOrd){}
  9.  
  10. string m_Key,m_Val;
  11. TItem * m_NextHash, * m_NextOrder, * m_PrevOrder;
  12. };
  13.  
  14. class CHash{
  15. public:
  16. CHash (int m) : m_Table(NULL),m_Size(m),m_FirstOrder(NULL),m_LastOrder(NULL)
  17. {
  18. init(m);
  19. }
  20.  
  21. ~CHash()
  22. {
  23. finalize();
  24. }
  25.  
  26. bool IsSet(string key)
  27. {
  28. TItem * temp = m_Table[hashFn(key)];
  29. if (temp == NULL)
  30. return false;
  31. while (temp != NULL)
  32. {
  33. if (temp -> m_Key == key)
  34. return true;
  35. temp = temp -> m_NextOrder;
  36. }
  37. return false;
  38. }
  39.  
  40. CHash(const CHash & src)
  41. {
  42. init(src.m_Size);
  43. copy(src.m_FirstOrder);
  44. }
  45.  
  46. CHash & operator = (const CHash & src)
  47. {
  48. finalize();
  49. init(src.m_Size);
  50. copy(src.m_FirstOrder);
  51. return *this;
  52. }
  53.  
  54. bool Ins(const string & key, const string & val)
  55. {
  56. string help = key;
  57. if (IsSet(help))
  58. return false;
  59. if (m_FirstOrder == NULL)
  60. {
  61. TItem * tmp01 = new TItem(key, val, NULL, NULL, NULL);
  62. m_Table[hashFn(help)] = tmp01;
  63. m_FirstOrder = m_LastOrder = tmp01;
  64. return true;
  65. }
  66. else
  67. {
  68. TItem * temp = m_Table[hashFn(help)];
  69. if (temp == NULL)
  70. {
  71. TItem * tmp02 = new TItem(key, val, NULL, NULL, m_LastOrder);
  72. m_Table[hashFn(help)] = tmp02;
  73. m_LastOrder -> m_NextOrder = tmp02;
  74. m_LastOrder = tmp02;
  75. return true;
  76. }
  77. while (temp -> m_NextHash != NULL)
  78. {
  79. if (temp -> m_Key == key)
  80. return false;
  81. temp = temp -> m_NextHash;
  82. }
  83. TItem * tmp03 = new TItem(key, val, NULL, NULL, m_LastOrder);
  84. m_Table[hashFn(help)] -> m_NextHash = tmp03;
  85. m_LastOrder -> m_NextOrder = tmp03;
  86. m_LastOrder = tmp03;
  87. return true;
  88. }
  89. }
  90.  
  91. bool Del (const string & key)
  92. {
  93. string help = key;
  94. TItem * temp = m_Table[hashFn(help)];
  95. if (temp == NULL)
  96. return false;
  97. while (temp != NULL)
  98. {
  99. if (temp -> m_Key == key)
  100. break;
  101. temp = temp -> m_NextHash;
  102. }
  103.  
  104. if (temp == NULL)
  105. return false;
  106.  
  107. if (m_FirstOrder == temp)
  108. m_FirstOrder = m_FirstOrder -> m_NextOrder;
  109. else
  110. temp -> m_PrevOrder -> m_NextOrder = temp -> m_NextOrder;
  111. if (m_LastOrder == temp)
  112. m_LastOrder = m_LastOrder -> m_PrevOrder;
  113.  
  114. m_Table[hashFn(help)] = temp -> m_NextHash;
  115. delete temp;
  116. return true;
  117. }
  118.  
  119. template <typename func>
  120. void ForEach(func f)
  121. {
  122.  
  123. }
  124. void printAll()
  125. {
  126.  
  127. }
  128.  
  129. private:
  130. void init (int m)
  131. {
  132. m_Size = m;
  133. m_Table = new TItem * [m];
  134. for (int i = 0; i < m; i++)
  135. m_Table[i] = NULL;
  136. m_FirstOrder = NULL;
  137. m_LastOrder = NULL;
  138. }
  139.  
  140. void finalize ()
  141. {
  142. TItem * temp = m_FirstOrder;
  143. while (temp != NULL)
  144. {
  145. TItem * tmp = temp;
  146. temp = temp -> m_NextOrder;
  147. delete tmp;
  148. }
  149. delete [] m_Table;
  150. }
  151.  
  152. void copy (TItem * src)
  153. {
  154. while (src != NULL)
  155. {
  156. Ins(src -> m_Key, src -> m_Val);
  157. src = src -> m_NextOrder;
  158. }
  159. }
  160.  
  161. TItem ** m_Table;
  162. unsigned int m_Size;
  163. TItem * m_FirstOrder, * m_LastOrder;
  164. unsigned int hashFn(string & str){
  165. std::hash<std::string> hash_fn;
  166. return hash_fn(str)%m_Size;
  167. }
  168. };
  169.  
  170. int main(int argc, char** argv) {
  171.  
  172. CHash hashtable(100);
  173. CHash hash2(50);
  174. hashtable.Ins("h1","car");
  175. assert ( !hashtable.Ins("h1","phone"));
  176. hashtable.Ins("h2","field");
  177. hashtable.Ins("h3","house");
  178. hashtable.Ins("h4","tree");
  179. hashtable.printAll();
  180. assert ( hashtable.Del("h3") );
  181. assert ( !hashtable.Ins("h4","tree") );
  182. assert(!hashtable.Del("h4d"));
  183. assert(hashtable.Del("h1"));
  184. assert(!hashtable.Del("h3"));
  185. assert(!hashtable.Del("h1"));
  186. cout << "ok" << endl;
  187.  
  188. hash2 = hashtable;
  189. hashtable.printAll();
  190. hash2.printAll();
  191. CHash b(hash2);
  192. b.printAll();
  193.  
  194.  
  195. hashtable.ForEach([](TItem * it ){
  196. cout<<it->m_Key<<" - "<<it->m_Val<<endl;
  197. });
  198.  
  199. return 0;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement