Guest User

Untitled

a guest
Jun 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5.  
  6. #define ARR_SIZE 10
  7.  
  8. struct Pair {
  9. const char* word;
  10. int val;
  11. };
  12.  
  13. struct Table {
  14. struct Pair* pairs[ARR_SIZE];
  15. size_t sz;
  16. };
  17.  
  18. struct Pair* make_pair(const char* word, int val)
  19. {
  20. assert(word);
  21.  
  22. struct Pair* pair = (struct Pair*)malloc(sizeof(struct Pair));
  23. pair->val = val;
  24. pair->word = word;
  25.  
  26. return pair;
  27. }
  28.  
  29. void table_empty(struct Table* tbl)
  30. {
  31. assert(tbl);
  32.  
  33. size_t i = 0;
  34. for (i = 0; i < tbl->sz; ++i) {
  35. free(tbl->pairs[i]);
  36. tbl->pairs[i] = NULL;
  37. }
  38. tbl->sz = 0;
  39. }
  40.  
  41. int search_word(struct Table* tbl, const char* word)
  42. {
  43. assert(tbl);
  44. assert(word);
  45.  
  46. size_t i = 0;
  47. for (i = 0; i < tbl->sz; ++i) {
  48.  
  49. //printf("%s %in", tbl->pairs[i]->word,i);
  50.  
  51. if (strcmp(tbl->pairs[i]->word, word) == 0) {
  52. return i;
  53. }
  54. }
  55. return -1; // error
  56. }
  57.  
  58. void table_insert(struct Table* tbl, const char* word, int val)
  59. {
  60. assert(tbl);
  61. assert(word);
  62.  
  63. int i = search_word(tbl, word);
  64. if (i != -1) { // replace val
  65.  
  66. tbl->pairs[i]->val = val;
  67. }
  68. else { // add new pair
  69. struct Pair* pair = make_pair(word, val);
  70.  
  71. tbl->pairs[tbl->sz] = pair; // add pair at the last position
  72. ++tbl->sz;
  73. }
  74. }
  75.  
  76. int table_find(struct Table* tbl, const char* word, int* return_val)
  77. {
  78. assert(tbl);
  79. assert(word);
  80. assert(return_val);
  81.  
  82. int i = search_word(tbl, word);
  83.  
  84. if (i != -1) {
  85. *return_val = tbl->pairs[i]->val;
  86. return 0;
  87. }
  88.  
  89. return -1; // error not found
  90. }
  91.  
  92. int table_remove(struct Table* tbl, const char* word)
  93. {
  94. assert(tbl);
  95. assert(word);
  96.  
  97. int i = search_word(tbl, word);
  98.  
  99. if (i == -1) return -1;
  100.  
  101. free(tbl->pairs[i]); // free value at current pos
  102.  
  103. tbl->pairs[i] = tbl->pairs[tbl->sz - 1]; // put address of last word at the pos of the current
  104. --tbl->sz; // "erase" last word
  105.  
  106. return 0;
  107. }
  108.  
  109. void table_print(struct Table* tbl)
  110. {
  111. assert(tbl);
  112.  
  113. printf("n");
  114. printf("table size = %in", tbl->sz);
  115.  
  116. for (int i = 0; i < tbl->sz; ++i)
  117. printf("%s %in", tbl->pairs[i]->word, tbl->pairs[i]->val);
  118. fflush(stdout);
  119. }
  120.  
  121. void print_search_result(struct Table* tbl, const char* word)
  122. {
  123. assert(tbl);
  124. assert(word);
  125.  
  126. int val = 0;
  127.  
  128. if (table_find(tbl, word, &val) == 0)
  129. printf("%s %in",word, val);
  130. else
  131. printf("%s not found in tablen", word);
  132. printf("n");
  133. fflush(stdout);
  134. }
  135.  
  136. void print_remove_result(struct Table* tbl, const char* word)
  137. {
  138. assert(tbl);
  139. assert(word);
  140.  
  141. if (table_remove(tbl, word) == -1)
  142. printf("%s not deletedn", word);
  143. else
  144. printf("%s deletedn", word);
  145. printf("n");
  146. fflush(stdout);
  147. }
  148.  
  149. int main()
  150. {
  151. struct Table table = { 0 };
  152. int val = 0;
  153.  
  154. table_insert(&table, "Hello", 10);
  155. table_insert(&table, "Test", 15);
  156. table_insert(&table, "Hello", 18); // testing overrite val
  157. table_insert(&table, "What", 5);
  158. table_insert(&table, "is", 3);
  159. table_insert(&table, "going", 4);
  160. table_insert(&table, "on", 77);
  161.  
  162. table_print(&table);
  163.  
  164. print_search_result(&table, "Hello");
  165. print_search_result(&table, "Test");
  166. print_search_result(&table, "keyword");
  167.  
  168. print_remove_result(&table, "Hello");
  169. print_remove_result(&table, "Hello"); // double delete == false
  170. print_remove_result(&table, "What");
  171. print_remove_result(&table, "going");
  172. print_remove_result(&table, "is");
  173. print_remove_result(&table, "on");
  174. print_remove_result(&table, "Test");
  175.  
  176. table_print(&table);
  177.  
  178. table_insert(&table, "Hello", 10);
  179. table_insert(&table, "Test", 15);
  180. table_insert(&table, "Hello", 18); // testing overrite val
  181. table_insert(&table, "What", 5);
  182. table_insert(&table, "is", 3);
  183. table_insert(&table, "going", 4);
  184. table_insert(&table, "on", 77);
  185.  
  186. table_print(&table);
  187.  
  188. table_empty(&table);
  189.  
  190. table_print(&table);
  191.  
  192. getchar();
  193. }
Add Comment
Please, Sign In to add comment