fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct no_teste {
  5. int valor;
  6. struct no_teste *ant;
  7. struct no_teste *prox;
  8. } no_teste;
  9.  
  10. void inserir(no_teste** lista, int valor){
  11. no_teste* novo = malloc(sizeof(no_teste));
  12. novo->valor = valor;
  13. novo->ant = NULL;
  14.  
  15. if (*lista == NULL){
  16. *lista = novo;
  17. (*lista)->prox = NULL;
  18. }
  19. else {
  20. novo->prox = *lista;
  21. (*lista)->ant = novo;
  22. *lista = novo;
  23. }
  24. }
  25.  
  26. no_teste* obter_no(no_teste* lista, int valor){
  27. no_teste* corrente = lista;
  28.  
  29. while (corrente != NULL){
  30. if (corrente->valor == valor) {
  31. return corrente;
  32. }
  33. corrente = corrente->prox;
  34. }
  35.  
  36. return NULL;
  37. }
  38.  
  39. void mostrar(no_teste* lista){
  40. printf("\nLista: ");
  41. no_teste* corrente = lista;
  42.  
  43. while (corrente != NULL){
  44. printf("%d -> ", corrente->valor);
  45. corrente = corrente->prox;
  46. }
  47. printf("NULL");
  48. }
  49.  
  50. void mostrarReverso(no_teste* lista){
  51. printf("\nLista invertida: ");
  52. no_teste* corrente = lista;
  53.  
  54. while (corrente->prox != NULL){
  55. corrente = corrente->prox;
  56. }
  57.  
  58. while (corrente != NULL){
  59. printf("%d -> ", corrente->valor);
  60. corrente = corrente->ant;
  61. }
  62.  
  63. printf("NULL");
  64. }
  65.  
  66. void swap(no_teste** lista, no_teste* A, no_teste* B) {
  67. if (A->ant != NULL){
  68. A->ant->prox = B;
  69. }
  70. else {
  71. *lista = B;
  72. }
  73.  
  74. if (B->prox != NULL){
  75. B->prox->ant = A;
  76. }
  77.  
  78. A->prox = B->prox;
  79. B->ant = A->ant;
  80. B->prox = A;
  81. A->ant = B;
  82. }
  83.  
  84. int main(){
  85. no_teste* lista = NULL;
  86.  
  87. inserir(&lista, 10);
  88. inserir(&lista, 15);
  89. inserir(&lista, 2);
  90. inserir(&lista, 9);
  91. inserir(&lista, 4);
  92.  
  93. printf("Lista inicial\n");
  94. mostrar(lista);
  95. mostrarReverso(lista);
  96.  
  97. printf("\n\nTroca de 9 e 2:\n");
  98.  
  99. no_teste* no9 = obter_no(lista, 9);
  100. no_teste* no2 = obter_no(lista, 2);
  101. swap(&lista,no9, no2);
  102.  
  103. mostrar(lista);
  104. mostrarReverso(lista);
  105.  
  106. printf("\n\nTroca de 15 e 10:\n");
  107.  
  108. no_teste* no15 = obter_no(lista, 15);
  109. no_teste* no10 = obter_no(lista, 10);
  110. swap(&lista,no15, no10);
  111.  
  112. mostrar(lista);
  113. mostrarReverso(lista);
  114.  
  115. printf("\n\nTroca de 4 e 2:\n");
  116.  
  117. no_teste* no4 = obter_no(lista, 4);
  118. swap(&lista,no4, no2);
  119.  
  120. mostrar(lista);
  121. mostrarReverso(lista);
  122. return 0;
  123. }
  124.  
Success #stdin #stdout 0s 4344KB
stdin
Standard input is empty
stdout
Lista inicial

Lista: 4 -> 9 -> 2 -> 15 -> 10 -> NULL
Lista invertida: 10 -> 15 -> 2 -> 9 -> 4 -> NULL

Troca de 9 e 2:

Lista: 4 -> 2 -> 9 -> 15 -> 10 -> NULL
Lista invertida: 10 -> 15 -> 9 -> 2 -> 4 -> NULL

Troca de 15 e 10:

Lista: 4 -> 2 -> 9 -> 10 -> 15 -> NULL
Lista invertida: 15 -> 10 -> 9 -> 2 -> 4 -> NULL

Troca de 4 e 2:

Lista: 2 -> 4 -> 9 -> 10 -> 15 -> NULL
Lista invertida: 15 -> 10 -> 9 -> 4 -> 2 -> NULL