fork download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. struct celula {
  5. int conteudo;
  6. struct celula *seg;
  7. };
  8. typedef struct celula cel;
  9.  
  10. void inserir(int x, cel **lst);
  11. void destruir(cel *p);
  12. void mostrarLista(cel *lst);
  13. void buscaMenor(cel **lst, cel ***menor);
  14. int buscaMenor_Remove(cel **lst);
  15.  
  16. int main() {
  17.  
  18. printf("Teste 1: Lista em ordem decrescente\n");
  19. cel *lst1 = NULL;
  20. inserir(9, &lst1);
  21. inserir(4, &lst1);
  22. inserir(2, &lst1);
  23. inserir(-1, &lst1);
  24. mostrarLista(lst1);
  25. printf("Conteudo: %d\n", buscaMenor_Remove(&lst1));
  26. mostrarLista(lst1);
  27. destruir(lst1);
  28.  
  29. printf("\nTeste 2: Lista em ordem crescente\n");
  30. cel *lst2 = NULL;
  31. inserir(-5, &lst2);
  32. inserir(2, &lst2);
  33. inserir(9, &lst2);
  34. inserir(21, &lst2);
  35. mostrarLista(lst2);
  36. printf("Conteudo: %d\n", buscaMenor_Remove(&lst2));
  37. mostrarLista(lst2);
  38. destruir(lst2);
  39.  
  40. printf("\nTeste 3: Lista fora de ordem com menor no final\n");
  41. cel *lst3 = NULL;
  42. inserir(15, &lst3);
  43. inserir(21, &lst3);
  44. inserir(9, &lst3);
  45. inserir(-5, &lst3);
  46. mostrarLista(lst3);
  47. printf("Conteudo: %d\n", buscaMenor_Remove(&lst3));
  48. mostrarLista(lst3);
  49. destruir(lst3);
  50.  
  51. printf("\nTeste 4: Lista fora de ordem com menor no inicio\n");
  52. cel *lst4 = NULL;
  53. inserir(-6, &lst4);
  54. inserir(15, &lst4);
  55. inserir(21, &lst4);
  56. inserir(9, &lst4);
  57. mostrarLista(lst4);
  58. printf("Conteudo: %d\n", buscaMenor_Remove(&lst4));
  59. mostrarLista(lst4);
  60. destruir(lst4);
  61.  
  62. printf("\nTeste 5: Lista fora de ordem com menor no meio\n");
  63. cel *lst5 = NULL;
  64. inserir(15, &lst5);
  65. inserir(-6, &lst5);
  66. inserir(21, &lst5);
  67. inserir(-8, &lst5);
  68. inserir(9, &lst5);
  69. inserir(4, &lst5);
  70. mostrarLista(lst5);
  71. printf("Conteudo: %d\n", buscaMenor_Remove(&lst5));
  72. mostrarLista(lst5);
  73. destruir(lst5);
  74.  
  75. printf("\nTeste 6: Lista fora de ordem com menor no meio e repetido\n");
  76. cel *lst6 = NULL;
  77. inserir(15, &lst6);
  78. inserir(-8, &lst6);
  79. inserir(21, &lst6);
  80. inserir(-8, &lst6);
  81. inserir(9, &lst6);
  82. inserir(4, &lst6);
  83. mostrarLista(lst6);
  84. printf("Conteudo: %d\n", buscaMenor_Remove(&lst6));
  85. mostrarLista(lst6);
  86. destruir(lst6);
  87.  
  88. printf("\nTeste 7: Lista unitaria\n");
  89. cel *lst7 = NULL;
  90. inserir(44, &lst7);
  91. mostrarLista(lst7);
  92. printf("Conteudo: %d\n", buscaMenor_Remove(&lst7));
  93. mostrarLista(lst7);
  94. destruir(lst7);
  95.  
  96. printf("\nTeste 8: Lista vazia\n");
  97. cel *lst8 = NULL;
  98. mostrarLista(lst8);
  99. printf("Conteudo: %d\n", buscaMenor_Remove(&lst8));
  100. mostrarLista(lst8);
  101. destruir(lst8);
  102.  
  103. printf("\nTeste 9: Lista com todos os elementos iguais\n");
  104. cel *lst9 = NULL;
  105. inserir(15, &lst9);
  106. inserir(15, &lst9);
  107. inserir(15, &lst9);
  108. inserir(15, &lst9);
  109. mostrarLista(lst9);
  110. printf("Conteudo: %d\n", buscaMenor_Remove(&lst9));
  111. mostrarLista(lst9);
  112. destruir(lst9);
  113.  
  114. return 0;
  115. }
  116.  
  117. void mostrarLista(cel *lst) {
  118. if (lst == NULL) {
  119. printf("NULL\n");
  120. } else {
  121. printf("%d->", lst->conteudo);
  122. mostrarLista(lst->seg);
  123. }
  124. }
  125.  
  126. void inserir(int x, cel **lst) {
  127. cel *nova = (cel*) malloc(sizeof(cel*));
  128. nova->conteudo = x;
  129. nova->seg = NULL;
  130. cel *p = *lst;
  131. if (p == NULL) {
  132. *lst = nova;
  133. } else {
  134. while (p->seg != NULL) {
  135. p = p->seg;
  136. }
  137. p->seg = nova;
  138. }
  139. }
  140.  
  141. void destruir(cel *lst) {
  142. if (lst == NULL) return;
  143. cel *p = lst->seg;
  144. free(lst);
  145. destruir(p);
  146. }
  147.  
  148. void buscaMenor(cel **lst, cel ***menor) {
  149. if ((*lst) == NULL) return;
  150. if ((*lst)->conteudo < (**menor)->conteudo) *menor = lst;
  151. buscaMenor(&(*lst)->seg, menor);
  152. }
  153.  
  154. int buscaMenor_Remove(cel **lst) {
  155. if (*lst == NULL) {
  156. printf("Lista Vazia!\n");
  157. return 0;
  158. }
  159.  
  160. cel **menor = lst;
  161. buscaMenor(lst, &menor);
  162. cel *p = *menor;
  163. if (menor == lst) *lst = p->seg;
  164. *menor = p->seg;
  165. int v = p->conteudo;
  166. free(p);
  167. return v;
  168. }
Success #stdin #stdout 0s 2244KB
stdin
Standard input is empty
stdout
Teste 1: Lista em ordem decrescente
9->4->2->-1->NULL
Conteudo: -1
9->4->2->NULL

Teste 2: Lista em ordem crescente
-5->2->9->21->NULL
Conteudo: -5
2->9->21->NULL

Teste 3: Lista fora de ordem com menor no final
15->21->9->-5->NULL
Conteudo: -5
15->21->9->NULL

Teste 4: Lista fora de ordem com menor no inicio
-6->15->21->9->NULL
Conteudo: -6
15->21->9->NULL

Teste 5: Lista fora de ordem com menor no meio
15->-6->21->-8->9->4->NULL
Conteudo: -8
15->-6->21->9->4->NULL

Teste 6: Lista fora de ordem com menor no meio e repetido
15->-8->21->-8->9->4->NULL
Conteudo: -8
15->21->-8->9->4->NULL

Teste 7: Lista unitaria
44->NULL
Conteudo: 44
NULL

Teste 8: Lista vazia
NULL
Lista Vazia!
Conteudo: 0
NULL

Teste 9: Lista com todos os elementos iguais
15->15->15->15->NULL
Conteudo: 15
15->15->15->NULL