fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct info {
  6. char nome[50];
  7. };
  8.  
  9. typedef struct Elemento {
  10. struct info info;
  11. struct Elemento *prox;
  12. } Elemento;
  13.  
  14. typedef struct entrada {
  15. struct info *dados;
  16. struct entrada *prox;
  17. } entrada;
  18.  
  19. #define TAMANHO_HASH 100
  20. entrada *hash_nomes[TAMANHO_HASH];
  21.  
  22. unsigned long hash(char *str){
  23. unsigned long hash = 5381;
  24. int c;
  25. while (c = *str++)
  26. hash = ((hash << 5) + hash) + c;
  27.  
  28. return hash;
  29. }
  30.  
  31. int adiciona_se_inexistente(struct info* dados){
  32. unsigned long key = hash(dados->nome) % TAMANHO_HASH;
  33.  
  34. entrada *corrente = hash_nomes[key];
  35. while (corrente != NULL){
  36. if (strcmp(corrente->dados->nome, dados->nome) == 0){
  37. return 0;
  38. }
  39. corrente = corrente->prox;
  40. }
  41.  
  42. entrada *nova = malloc(sizeof(entrada));
  43. nova->prox = hash_nomes[key];
  44. nova->dados = dados;
  45. hash_nomes[key] = nova;
  46. return 1;
  47. }
  48.  
  49.  
  50. void remove_duplicados(Elemento* agenda){
  51. Elemento *corrente = agenda, *anterior = NULL;
  52.  
  53. while (corrente != NULL){
  54. if (adiciona_se_inexistente(&corrente->info) == 0){
  55. anterior->prox = corrente->prox;
  56. Elemento* remover = corrente;
  57. corrente = corrente -> prox;
  58. free(remover);
  59. }
  60. else {
  61. anterior = corrente;
  62. corrente = corrente -> prox;
  63. }
  64. }
  65. }
  66.  
  67. void mostrar_lista(Elemento* agenda){
  68. Elemento *p;
  69. for(p = agenda; p != NULL; p = p -> prox){
  70. printf("%s -> ", p->info.nome);
  71. }
  72.  
  73. printf(" NULL");
  74. }
  75.  
  76. int main() {
  77. Elemento *agenda = malloc(sizeof(Elemento));
  78. strcpy(agenda->info.nome,"ana");
  79. Elemento *agenda2 = malloc(sizeof(Elemento));
  80. strcpy(agenda2->info.nome,"ana");
  81. Elemento *agenda3 = malloc(sizeof(Elemento));
  82. strcpy(agenda3->info.nome,"carla");
  83. Elemento *agenda4 = malloc(sizeof(Elemento));
  84. strcpy(agenda4->info.nome,"vitor");
  85. Elemento *agenda5 = malloc(sizeof(Elemento));
  86. strcpy(agenda5->info.nome,"vitor");
  87. Elemento *agenda6 = malloc(sizeof(Elemento));
  88. strcpy(agenda6->info.nome,"ana");
  89.  
  90. agenda->prox = agenda2;
  91. agenda2->prox = agenda3;
  92. agenda3->prox = agenda4;
  93. agenda4->prox = agenda5;
  94. agenda5->prox = agenda6;
  95. agenda6->prox = NULL;
  96.  
  97. memset(hash_nomes, 0, sizeof(hash_nomes));
  98. mostrar_lista(agenda);
  99. remove_duplicados(agenda);
  100. printf("\n\nDuplicados removidos\n\n");
  101. mostrar_lista(agenda);
  102.  
  103. return 0;
  104. }
  105.  
  106.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
ana -> ana -> carla -> vitor -> vitor -> ana ->  NULL

Duplicados removidos

ana -> carla -> vitor ->  NULL