Guest User

Untitled

a guest
Nov 20th, 2017
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.91 KB | None | 0 0
  1. /*
  2. * PROGRAM: OPEN HASH TABLE
  3. *
  4. * @author Serrato Guerrero Michael Brandon <mikebsg01@gmail.com>
  5. */
  6. #include <stdio.h>
  7. #include <malloc.h>
  8.  
  9. /* ------------------------------- E S T R U C T U R A S ------------------------------- */
  10. struct pair {
  11. int key;
  12. int dato;
  13. struct pair* next; // porque están encadenados como lista lineal dinámica
  14. };
  15. typedef struct pair t_pair;
  16.  
  17.  
  18. /* ----------------------------------- P R O T O T I P O S ------------------------------ */
  19.  
  20. void search(t_pair h_table[], int size);
  21. void display(t_pair h_table[], int size);
  22. void insert(t_pair h_table[], int size);
  23. void eliminar(t_pair h_table[], int size);
  24. void inicializarValoresHashTable(t_pair h_table[], int size);
  25. void ingresarElementos(t_pair h_table[], int size);
  26. int menu();
  27. /* ------------------------------ F I N P R O T O T I P O S ------------------------- */
  28.  
  29. int main() {
  30. int size, opc;
  31.  
  32. printf("=== HASH ABIERTO ===\n\n");
  33. printf("Ingresa el tamano de la tabla: ");
  34. scanf("%d", &size);
  35. printf("------------------------------------------------\n\n");
  36.  
  37. t_pair hash_table[size];
  38. inicializarValoresHashTable(hash_table, size);
  39. ingresarElementos(hash_table, size);
  40.  
  41. do {
  42. opc = menu();
  43. printf("\n");
  44. switch(opc) {
  45. case 1 : printf("**** Se activo la opcion #1: Desplegar Tabla Hash. \n\n");
  46. display(hash_table, size);
  47. break;
  48. case 2 : printf("**** Se activo la opcion #2: Insertar en Tabla Hash. \n\n");
  49. printf("Ingresar elemento que se desea insertar: ");
  50. insert(hash_table, size);
  51. break;
  52. case 3 : printf("**** Se activo la opcion #3: Buscar en Tabla Hash. \n\n");
  53. search(hash_table, size);
  54. break;
  55. case 4 : printf("**** Se activo la opcion #4: Eliminar en Tabla Hash. \n\n");
  56. eliminar(hash_table, size);
  57. break;
  58. } // switch
  59. printf("--------------------------------------------------------------------------------\n\n");
  60. } while (opc != 5);
  61.  
  62.  
  63. return 0;
  64. } // fin main
  65.  
  66.  
  67. /* -------------------------- I M P L E M E N T A C I O N E S ---------------------------- */
  68.  
  69. void display(t_pair h_table[], int size) {
  70. printf("Key\tDatos\n");
  71.  
  72. for (int i = 0; i < size; ++i) {
  73. printf("%d\t%d\n", h_table[i].key, h_table[i].dato);
  74.  
  75. t_pair* ptr;
  76. ptr = h_table[i].next;
  77.  
  78. while (ptr != 0) {
  79. printf("\t%d", ptr->dato);
  80. ptr = ptr->next;
  81. }
  82. printf("\n\n");
  83. }
  84. } // display
  85.  
  86.  
  87. void search(t_pair h_table[], int size) {
  88. int key,
  89. elemento;
  90.  
  91. printf("Ingresar elemento que se desea buscar: ");
  92. scanf("%d", &elemento);
  93. key = elemento%size;
  94.  
  95. if (h_table[key].dato == elemento) {
  96. printf("Elemento: <%d, %d>", key, h_table[key].dato);
  97. } else { // Buscar en la lista de <key, dato>
  98. int encontrado = 0;
  99.  
  100. printf("Cabeza (%d, %d): ", key, h_table[key].dato);
  101. t_pair* ptr;
  102. ptr = h_table[key].next;
  103.  
  104. while (ptr != 0) {
  105. printf("<%d, %d> ", key, ptr->dato);
  106.  
  107. if (ptr->dato == elemento) {
  108. printf(" *Elemento: [%d, %d]", key, ptr->dato);
  109. encontrado = 1;
  110. break;
  111. }
  112. ptr = ptr->next;
  113. }
  114.  
  115. if (encontrado == 0)
  116. printf("Elemento: [%d] No existe en la Tabla Hash.", elemento);
  117. }// else
  118. printf("\n");
  119. } // search
  120.  
  121. void insert(t_pair h_table[], int size) {
  122. int elemento;
  123. int key;
  124.  
  125. scanf("%d", &elemento);
  126. key = elemento%size;
  127.  
  128. if (h_table[key].key == -1) {
  129. h_table[key].key = key;
  130. h_table[key].dato = elemento;
  131. } else {
  132. t_pair* ptr_pair;
  133. ptr_pair = (t_pair*)malloc(sizeof(t_pair));
  134. ptr_pair->key = key;
  135. ptr_pair->dato = elemento;
  136. ptr_pair->next = h_table[key].next;
  137. h_table[key].next = ptr_pair;
  138. }
  139. } // insert
  140.  
  141. void eliminar(t_pair h_table[], int size) {
  142. int key, elemento;
  143. t_pair *prev, *current;
  144.  
  145. printf("Ingresar elemento que se desea eliminar: ");
  146. scanf("%d", &elemento);
  147. key = elemento % size;
  148. prev = &h_table[key];
  149.  
  150. if (h_table[key].dato == elemento) {
  151. current = &h_table[key];
  152. printf("Elemento: <%d, %d> - encontrado!\n", key, current->dato);
  153. } else {
  154. int encontrado = 0;
  155.  
  156. printf("Cabeza (%d, %d): ", key, h_table[key].dato);
  157. current = prev->next;
  158.  
  159. while (current != 0) {
  160. printf("<%d, %d> ", key, current->dato);
  161.  
  162. if (current->dato == elemento) {
  163. printf(" *Elemento: [%d, %d] - encontrado!\n", key, current->dato);
  164. encontrado = 1;
  165. break;
  166. }
  167. prev = current;
  168. current = current->next;
  169. }
  170.  
  171. if (encontrado != 1) {
  172. printf("Imposible eliminar el elemento: [%d] ya que no existe en la Tabla Hash.\n", elemento);
  173. return;
  174. }
  175. }
  176.  
  177. if (prev != current) {
  178. prev->next = current->next;
  179. free(current);
  180. } else {
  181. current = current->next;
  182.  
  183. if (current != 0) {
  184. prev->key = current->key;
  185. prev->dato = current->dato;
  186. prev->next = current->next;
  187. free(current);
  188. } else {
  189. prev->key = prev->dato = -1;
  190. prev->next = 0;
  191. }
  192. }
  193. printf("El elemento: [%d] ha sido eliminado exitosamente! :)\n", elemento);
  194. } // eliminar
  195.  
  196. void inicializarValoresHashTable(t_pair h_table[], int size) {
  197. for (int key = 0; key < size; ++key) {
  198. h_table[key].key = -1;
  199. h_table[key].dato = -1;
  200. h_table[key].next = 0;
  201. }
  202. } // inicializarValoresHashTable
  203.  
  204. void ingresarElementos(t_pair h_table[], int size) {
  205. int elemento;
  206.  
  207. printf("Ingrese los elementos: \n");
  208.  
  209. for (int i = 0; i < size; ++i) {
  210. insert(h_table, size);
  211. }
  212. printf("-----------------------\n");
  213. } // ingresarElementos
  214.  
  215. /* ----------------------------------- m e n u ----------------------------------- */
  216.  
  217. int menu() {
  218. int opcion = 0;
  219.  
  220. do {
  221. printf("Elija una opcion [1..5] \n\n");
  222. printf("1. Desplegar Tabla Hash. \n");
  223. printf("2. Insertar Elemento en Tabla Hash. \n");
  224. printf("3. Buscar Elementos en Tabla Hash. \n");
  225. printf("4. Eliminar Elemento en Tabla Hash. \n");
  226. printf("5. Salir del sistema \n");
  227. printf("> ");
  228. scanf("%d", &opcion);
  229. printf("\n");
  230. if (opcion >=1 && opcion <= 5)
  231. break;
  232. else
  233. printf("ERROR. Opcion no valida [%d] \n", opcion);
  234. } while (true);
  235.  
  236. return opcion;
  237. } // fin menu
  238.  
  239. /* --------------------------------------------------------------------------------------------------- //
  240. CORRIDAS - Programa: HASH ABIERTO
  241. ------------------------------------------------------------------------------------------------------ //
  242.  
  243. Ingresa el tamano de la tabla: 3
  244.  
  245. Ingrese los elementos:
  246. 3
  247. 8
  248. 10
  249.  
  250. Elija una opcion [1..5]> 1
  251. **** Se activo la opcion #1: Desplegar Tabla Hash.
  252.  
  253. Key Datos
  254. 0 3
  255. 1 10
  256. 2 8
  257.  
  258. Elija una opcion [1..5]> 2
  259. **** Se activo la opcion #2: Insertar en Tabla Hash.
  260.  
  261. Ingresar elemento que se desea insertar: 4
  262.  
  263. Elija una opcion [1..5]> 2
  264. **** Se activo la opcion #2: Insertar en Tabla Hash.
  265.  
  266. Ingresar elemento que se desea insertar: 7
  267.  
  268. Elija una opcion [1..5]> 1
  269. **** Se activo la opcion #1: Desplegar Tabla Hash.
  270.  
  271. Key Datos
  272. 0 3
  273. 1 10
  274. 7 4
  275. 2 8
  276.  
  277. Elija una opcion [1..5]> 4
  278. **** Se activo la opcion #4: Eliminar en Tabla Hash.
  279.  
  280. Ingresar elemento que se desea eliminar: 7
  281.  
  282. Cabeza (1, 10): <1, 7> *Elemento: [1, 7] - encontrado!
  283. El elemento: [7] ha sido eliminado exitosamente! :)
  284.  
  285. Elija una opcion [1..5]> 1
  286.  
  287. **** Se activo la opcion #1: Desplegar Tabla Hash.
  288.  
  289. Key Datos
  290. 0 3
  291. 1 10
  292. 4
  293. 2 8
  294.  
  295. Elija una opcion [1..5]> 4
  296.  
  297. **** Se activo la opcion #4: Eliminar en Tabla Hash.
  298.  
  299. Ingresar elemento que se desea eliminar: 4
  300.  
  301. Cabeza (1, 10): <1, 4> *Elemento: [1, 4] - encontrado!
  302. El elemento: [4] ha sido eliminado exitosamente! :)
  303.  
  304. Elija una opcion [1..5]> 1
  305.  
  306. **** Se activo la opcion #1: Desplegar Tabla Hash.
  307.  
  308. Key Datos
  309. 0 3
  310. 1 10
  311. 2 8
  312.  
  313. Elija una opcion [1..5]> 4
  314.  
  315. **** Se activo la opcion #4: Eliminar en Tabla Hash.
  316.  
  317. Ingresar elemento que se desea eliminar: 18
  318.  
  319. Cabeza (0, 3): Imposible eliminar el elemento: [18] ya que no existe en la Tabla Hash.
  320.  
  321. Elija una opcion [1..5]> 4
  322.  
  323. **** Se activo la opcion #4: Eliminar en Tabla Hash.
  324.  
  325. Ingresar elemento que se desea eliminar: 10
  326.  
  327. Elemento: <1, 10> - encontrado!
  328. El elemento: [10] ha sido eliminado exitosamente! :)
  329.  
  330. Elija una opcion [1..5]> 1
  331.  
  332. **** Se activo la opcion #1: Desplegar Tabla Hash.
  333.  
  334. Key Datos
  335. 0 3
  336. -1 -1
  337. 2 8
  338.  
  339. Elija una opcion [1..5]> 5
  340.  
  341. Saliendo...
  342.  
  343. **** Programa finalizado ****
  344.  
  345. ------------------------------------------------------------------------------------------------------ */
Add Comment
Please, Sign In to add comment