Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. using namespace std;
  5. ifstream fin("linkedmap.in");
  6. ofstream fout("linkedmap.out");
  7. struct item {
  8. item* prev = NULL;
  9. item* prev_key = NULL;
  10. string key;
  11. string value;
  12. item* next_key = NULL;
  13. item* next = NULL;
  14. };
  15.  
  16. vector<item*> HashTable = vector<item*>(1000003);
  17.  
  18. item* CreateNode(string& key, string& value) {
  19. auto node = new item;
  20. node->prev = NULL;
  21. node->prev_key = NULL;
  22. node->key = key;
  23. node->value = value;
  24. node->next_key = NULL;
  25. node->next = NULL;
  26. return node;
  27. }
  28.  
  29. item* AddNode(item*& tail, string& key, string& value) {
  30. item* node = CreateNode(key, value);
  31. node->prev = tail;
  32. tail->next = node;
  33. return node;
  34. }
  35.  
  36. long long GetHash(string& key) {
  37. const int p = 31;
  38. long long hash = 0, p_pow = 1;
  39. for (char i : key)
  40. {
  41. hash += (i - 'a' + 1) * p_pow;
  42. p_pow *= p;
  43. }
  44.  
  45. long long m = 1000003;
  46.  
  47. if (hash >= 0) {
  48. return hash % m;
  49. }
  50. else {
  51. return (m - abs(hash) % m) % m;
  52. }
  53. }
  54.  
  55. item* Put(string& key, string& value, item*& LastKey) {
  56. item* head = HashTable[GetHash(key)];
  57. if (head == NULL) {
  58. HashTable[GetHash(key)] = CreateNode(key, value);
  59. HashTable[GetHash(key)]->prev_key = LastKey;
  60.  
  61. if (LastKey != NULL)
  62. LastKey->next_key = HashTable[GetHash(key)];
  63.  
  64. return HashTable[GetHash(key)];
  65. }
  66. else {
  67. item* pointer = head;
  68. while (pointer->next != NULL) {
  69. if (pointer->key == key) {
  70. pointer->value = value;
  71. return NULL;
  72. }
  73. pointer = pointer->next;
  74. }
  75.  
  76. if (pointer->key != key) {
  77. item* new_node = AddNode(pointer, key, value);
  78. new_node->prev_key = LastKey;
  79. if (LastKey != NULL)
  80. LastKey->next_key = new_node;
  81. return new_node;
  82. }
  83. else {
  84. pointer->value = value;
  85. return NULL;
  86. }
  87. }
  88. }
  89.  
  90. void Delete(string& key, item*& LastKey) {
  91. item* pointer = HashTable[GetHash(key)];
  92.  
  93. while (pointer != NULL) {
  94. if (pointer->key == key) {
  95.  
  96. if (LastKey == pointer)
  97. LastKey = pointer->prev_key;
  98.  
  99. if (pointer->prev_key != NULL)
  100. pointer->prev_key->next_key = pointer->next_key;
  101.  
  102. if (pointer->next_key != NULL)
  103. pointer->next_key->prev_key = pointer->prev_key;
  104.  
  105. if (pointer->prev != NULL)
  106. pointer->prev->next = pointer->next;
  107.  
  108. if (pointer->next != NULL)
  109. pointer->next->prev = pointer->prev;
  110.  
  111. if (pointer == HashTable[GetHash(key)])
  112. HashTable[GetHash(key)] = NULL;
  113.  
  114. free(pointer);
  115. return;
  116. }
  117. pointer = pointer->next;
  118. }
  119.  
  120. }
  121.  
  122. bool Get(string& key) {
  123. item* pointer = HashTable[GetHash(key)];
  124.  
  125. while (pointer != NULL) {
  126. if (pointer->key == key) {
  127. fout << pointer->value << "\n";
  128. return true;
  129. }
  130. pointer = pointer->next;
  131. }
  132.  
  133. fout << "none\n";
  134. return false;
  135. }
  136.  
  137. item* Find(string& key) {
  138. item* pointer = HashTable[GetHash(key)];
  139.  
  140. while (pointer != NULL) {
  141. if (pointer->key == key)
  142. return pointer;
  143.  
  144. pointer = pointer->next;
  145. }
  146.  
  147. return NULL;
  148. }
  149.  
  150. void Prev(string& key) {
  151. item* element = Find(key);
  152. if (element != NULL && element->prev_key != NULL)
  153. fout << element->prev_key->value << "\n";
  154. else
  155. fout << "none\n";
  156. }
  157.  
  158. void Next(string& key) {
  159. item* element = Find(key);
  160. if (element != NULL && element->next_key != NULL)
  161. fout << element->next_key->value << "\n";
  162. else
  163. fout << "none\n";
  164. }
  165.  
  166. int main() {
  167. ios_base::sync_with_stdio(false);
  168. fin.tie(NULL);
  169.  
  170. item* LastKey = NULL;
  171. string line;
  172. string key, value;
  173.  
  174. while (fin >> line) {
  175. fin >> key;
  176. if (line == "put") {
  177. fin >> value;
  178. item* pointer = Put(key, value, LastKey);
  179. if (pointer != NULL) LastKey = pointer;
  180. }
  181. else if (line == "delete") {
  182. Delete(key, LastKey);
  183. }
  184. else if (line == "get") {
  185. Get(key);
  186. }
  187. else if (line == "prev") {
  188. Prev(key);
  189. }
  190. else if (line == "next") {
  191. Next(key);
  192. }
  193. }
  194.  
  195. return 0;
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement