Advertisement
richard1992

Untitled

Jul 22nd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.91 KB | None | 0 0
  1. //Richard Andrei Aquino dos Santos
  2. //AED2
  3.  
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8.  
  9. typedef struct dado {
  10. char valor;
  11. struct dado *prox;
  12. } Hash;
  13.  
  14. void insereNovo(Hash **tabela, int i, char letra);
  15. void insereHash(Hash** tabela, char valorA, char valorB, int tamanho);
  16. void ordena(Hash** tabela, int i);
  17. int tamanho;
  18.  
  19. int main() {
  20. int nTestes, C, k, i, j,l,m;
  21. char letra, a, b;
  22. Hash** tabela;
  23. Hash* tmp;
  24. scanf("%d", &nTestes); //nTestes serve para fazer varios testes de hashs de entradas diferentes
  25. tabela = (Hash **)malloc(sizeof(Hash*));
  26. m = 0;
  27. for (k = 0; k < nTestes; k++) {
  28. letra = 'a';
  29. scanf("%d %d", &tamanho, &C); //tamanho = tamanho do vertice , C numero de arestas
  30. tabela = (Hash **)realloc(tabela, tamanho * sizeof(Hash*)); // aloca tabela com tamanho inicial maximo
  31.  
  32. for (i = 0; i < tamanho; i++) { // insere todos as letras usadas em cada posição inicial na tabela
  33. insereNovo(tabela, i, letra);
  34. letra++;//a +1 = b // b + 1 = c
  35. }/*
  36. for (i = 0; i < tamanho; i++) {
  37. printf("%d %c\n", i, tabela[i]->valor);//testando se inserções foram corretas
  38. }*/
  39.  
  40. for (i = 0; i < C; i++) { // recebendo valores para serem inseridos
  41. fflush(stdin);
  42. scanf("\n%c \n%c",&a,&b);
  43. insereHash(tabela, a, b, tamanho);
  44. }
  45. j = 0;
  46. l = 0;
  47. printf("Case #%d:\n", m);
  48. m++;
  49. while (j < tamanho) { // j = indica a chave
  50.  
  51. tmp = tabela[j];
  52. if (tmp != NULL) {
  53. l++;
  54.  
  55. }
  56. while (tmp != NULL) { //Enquanto existir algo
  57. printf("%c,", tmp->valor); //imprime o valor e
  58. tmp = tmp->prox; // avança pro proximo
  59. }
  60. if(tabela[j] != NULL)
  61. printf("\n");
  62. j++;
  63.  
  64. }
  65. printf("%d connected components\n\n", l);
  66. }
  67. //free(tabela);
  68. return 0;
  69. }
  70.  
  71. void insereHash(Hash** tabela, char valorA, char valorB, int tamanho) {
  72. Hash *novoA, *novoB, *auxA, *auxB;
  73. int i, matchA = 0, matchB = 0, aux = 0, ia = 1000, ib = 1000, iaux;
  74. //printf("%c %c", valorA, valorB);
  75. for (i = 0; i < tamanho; i++) {
  76. novoA = tabela[i];
  77. novoB = tabela[i];
  78. /*while (novoA == NULL) {
  79. i++;
  80. novoA = tabela[i];
  81. novoB = tabela[i];
  82. }*/
  83. aux = 0;
  84. if(novoA != NULL){
  85. if (matchA == 0) { // matchA indica quando foi encontrado na tabela o valorA recebido
  86. while (aux == 0) { //aux indica se foi encontrado ou chegou em NULL
  87. //printf("novoA %c valorA %c\n", novoA->valor, valorA);
  88. if (novoA->valor == valorA) {
  89. matchA = 1;
  90. aux = 1;
  91. ia = i;
  92. }
  93. else {
  94. novoA = novoA->prox;
  95. }
  96. if (novoA == NULL) {//não esta nessa lista então vamos pra proxima
  97. aux = 1;
  98. }
  99.  
  100. }
  101. }
  102. aux = 0;
  103. if (matchB == 0) {// matchB indica quando foi encontrado na tabela o valorB recebido
  104. while (aux == 0) {//aux indica se foi encontrado ou chegou em NULL printf("%c\n", novoB->valor);
  105. //printf("%c\n", novoB->valor);
  106. if (novoB->valor == valorB) {
  107. matchB = 1;
  108. aux = 1;
  109. ib = i;
  110. }
  111. else {
  112. novoB = novoB->prox;
  113. }
  114. if (novoB == NULL) {
  115. aux = 1;
  116. }
  117.  
  118. }
  119. }
  120. }
  121.  
  122. }
  123. aux = 0;
  124. novoA = tabela[ia]; //ia aponta em qual lista foi encontrado o valorA
  125. novoB = tabela[ib]; //ib aponta em qual lista foi encontrado o valorB
  126. if (ia < ib) {// Se a lista os valores da lista A são menores que da lista B
  127. while (novoA->prox != NULL)
  128. novoA = novoA->prox;
  129. novoA->prox = novoB; // coloca a lista ja encontrada em novoB no fim da lista de novoA
  130. //printf("%d %d\n", matchA, matchB);
  131. //printf("%d %d", ia, ib);
  132. ordena(tabela, ia);// ordena a nova lista formada por A e B
  133. tabela[ib] = NULL;//diz que a tabela onde a lista B estava não será mais utilizada
  134. }
  135. else {
  136. if (ia > ib) {// Se a lista os valores da lista B são menores que da lista A
  137. while (novoB->prox != NULL)
  138. novoB = novoB->prox;
  139. novoB->prox = novoA;// coloca a lista ja encontrada em novoA no fim da lista de novoB
  140. //printf("%d %d\n", matchA, matchB);
  141. //printf("%d %d", ia, ib);
  142. ordena(tabela, ib);// ordena a nova lista formada por A e B
  143. tabela[ia] = NULL;//diz que a tabela onde a lista A estava não será mais utilizada
  144. }
  145.  
  146.  
  147. }
  148. auxA = tabela[0];
  149. while (auxA != NULL) {
  150. //printf("%c", auxA->valor);
  151. auxA = auxA->prox;
  152. }
  153. }
  154.  
  155. void ordena(Hash** tabela, int i){// ordena a lista
  156. Hash *A,*B,*aux;
  157. char vA,vB;
  158. A = tabela[i];
  159. vA = A->valor;
  160. while (A->prox != NULL) {
  161. B = A->prox;
  162. while (B != NULL) {
  163. vB = B->valor;
  164. if (A->valor > B->valor) {
  165. A->valor = vB;
  166. B->valor = vA;
  167. }
  168. B = B->prox;
  169. }
  170. A = A->prox;
  171. vA = A->valor;
  172. }
  173. }
  174.  
  175. void insereNovo(Hash **tabela, int i, char letra) {
  176. Hash *tmp;
  177. tmp = (Hash *)malloc(sizeof(Hash));
  178. tmp->valor = letra;
  179. tmp->prox = NULL;
  180. tabela[i] = tmp;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement