Advertisement
DimasDark

L1Q1 1.3s

Jun 1st, 2013
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.49 KB | None | 0 0
  1. #include <stdio.h>
  2. //#include <time.h>
  3.  
  4. //FILA DUPLAMENTE ENCADEADA NO ESTILO FILA ~DIMAS~DARK~
  5.  
  6. typedef struct no
  7. {
  8.     int valor;
  9.     struct no *proximo, *anterior;
  10. } No;
  11.  
  12. typedef struct lista
  13. {
  14.     No* inicio;
  15.     No* fim;
  16.  
  17. } Carta;
  18.  
  19.  
  20.  
  21. Carta* inicializa()
  22. {
  23.     Carta* l = new Carta();
  24.     l ->inicio = l->fim = NULL;
  25.     return l;
  26. }
  27.  
  28. int isVazia(Carta* l)
  29. {
  30.     if (l->inicio == NULL)
  31.         return 1;
  32.     else
  33.         return 0;
  34. }
  35.  
  36. //Insere no início
  37. Carta* insereNoInicio(Carta* l, int v)
  38. {
  39.     No* novo = new No();
  40.     novo->valor = v;
  41.     novo->anterior = NULL;
  42.     novo->proximo = l->inicio;
  43.     if (l->inicio != NULL)
  44.     {
  45.         l->inicio->anterior = novo;
  46.         l->inicio = novo;
  47.     }
  48.     else
  49.     {
  50.         l->inicio = l->fim = novo;
  51.     }
  52.  
  53.  
  54.     return l;
  55. }
  56.  
  57. //Insere no fim
  58. Carta* insereNoFinal(Carta* l, int v)
  59. {
  60.     No* novo = new No();
  61.     novo ->valor = v;
  62.     novo ->proximo = NULL;
  63.     novo ->anterior = l->fim;
  64.     if (l->fim != NULL)
  65.     {
  66.         l->fim->proximo = novo;
  67.         l->fim = novo;
  68.     }
  69.     else
  70.         l->inicio = l->fim = novo;
  71.  
  72.  
  73.     return l;
  74. }
  75.  
  76. //Funções retira
  77. No* retiraIni(No* n)
  78. {
  79.     No* p = n->proximo;
  80.     if (p != NULL)
  81.         p->anterior = NULL;
  82.     delete(n);
  83.     return p;
  84.  
  85. }
  86.  
  87. No* retiraFim(No* n)
  88. {
  89.     No* p = n->anterior;
  90.     if (p != NULL)
  91.         p->proximo = NULL;
  92.     delete(n);
  93.     return p;
  94. }
  95.  
  96.  
  97. int retiraDoInicio(Carta* l)   //Remove do inicio e retorna o valor que removeu
  98. {
  99.     int v;
  100.     v = l->inicio->valor;
  101.     l->inicio = retiraIni(l->inicio);
  102.     if (l->inicio == NULL)
  103.         l->fim = NULL;
  104.     return v;
  105. }
  106.  
  107. int retiraDoFinal(Carta* l)   //Retira do final e retorna o valor que removeu
  108. {
  109.     int v;
  110.     v = l->fim->valor;
  111.     l->fim = retiraFim(l->fim);
  112.     if (l->fim == NULL)
  113.         l->inicio = NULL;
  114.     return v;
  115. }
  116.  
  117.  
  118. void imprimeCartas(Carta* l)
  119. {
  120.     No* p;
  121.     for (p = l->inicio; p != NULL; p = p->proximo)
  122.     {
  123.         if (p->proximo == NULL)
  124.             printf("%d", p->valor);
  125.         else
  126.             printf("%d ", p->valor);
  127.     }
  128.  
  129. }
  130.  
  131.  
  132.  
  133. int main()
  134. {
  135.  
  136.  
  137.     freopen("L1Q1.in", "r", stdin);
  138.     freopen("L1Q1.out", "w", stdout);
  139.  
  140.     int contador;
  141.     int entrada;
  142.     int armazena_valor;
  143.     int numero_cartas;
  144. //    double inicio,fim;
  145. //    inicio = clock();
  146.     while(scanf("%d", &contador) != EOF)
  147.     {
  148.         numero_cartas = contador-1;
  149.         //Inicializa o baralho de entrada/saida
  150.         Carta* cartas;
  151.         cartas = inicializa();
  152.  
  153.         while(contador > 0)
  154.         {
  155.             scanf("%d", &entrada);
  156.             if (isVazia(cartas) == 1)
  157.             {
  158.                 cartas = insereNoInicio(cartas, entrada);
  159.             }
  160.             else
  161.                 cartas = insereNoFinal(cartas, entrada);
  162.             contador--;
  163.         }
  164.  
  165.  
  166.  
  167.         while (numero_cartas > 0)
  168.         {
  169.             if (numero_cartas == 1)
  170.             {
  171.                 if (cartas->inicio->valor >= cartas->fim->valor)
  172.                 {
  173.                     armazena_valor = retiraDoFinal(cartas);
  174.                     printf("%d", armazena_valor);
  175.                 }
  176.                 else
  177.                 {
  178.                     armazena_valor = retiraDoInicio(cartas);
  179.                     printf("%d", armazena_valor);
  180.                 }
  181.  
  182.             }
  183.             else
  184.             {
  185.                 if (cartas->inicio->valor < cartas->fim->valor) //Caso o primeiro for menor que o ultimo
  186.                 {
  187.                     armazena_valor = retiraDoInicio(cartas); //Remove e armazena o valor do primeiro
  188.                     printf("%d ", armazena_valor);
  189.                     armazena_valor = retiraDoInicio(cartas); //Remove o novo valor do inicio
  190.                     cartas = insereNoFinal(cartas, armazena_valor); //Reinsere no final
  191.                 }
  192.                 else //Se o valor for maior ou igual, vai remover do final
  193.                 {
  194.                     armazena_valor = retiraDoFinal(cartas); //Retiro do final
  195.                     printf("%d ", armazena_valor);
  196.                     armazena_valor = retiraDoFinal(cartas); //Retiro o novo valor do final e armazeno
  197.                     cartas = insereNoInicio(cartas, armazena_valor); //Joga pro começo uma de mesmo valor
  198.                 }
  199.  
  200.             }
  201.             numero_cartas--;
  202.  
  203.         }
  204.  
  205.         printf("\n");
  206.     }
  207. //    fim = clock();
  208. //   printf("\nO tempo de execucao foi: %fs", (fim-inicio)/1000);
  209.  
  210.  
  211.  
  212.  
  213.     return 0;
  214.  
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement