fork download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5.  
  6. /* Estrutura que armazenara um simbolo */
  7. typedef struct symbol {
  8. int id;
  9. char *symname;
  10. struct symbol *vence1;
  11. struct symbol *vence2;
  12. } tipoSymbol;
  13.  
  14.  
  15. /* Funcao que cria uma lista circular duplamente encadeada vazia (noh cabeca) */
  16. tipoSymbol *inicializar_lst() {
  17. tipoSymbol *lst;
  18. lst = (tipoSymbol*) malloc(sizeof(tipoSymbol));
  19.  
  20. lst->vence1 = lst;
  21. lst->vence2 = lst;
  22.  
  23. return lst;
  24. }
  25.  
  26.  
  27. /* Percorre a lista (travessia), imprimindo seus elementos */
  28. void imprimir(tipoSymbol *lst) {
  29. tipoSymbol *p = lst;
  30. int sentinela = lst->id;
  31.  
  32. do {
  33. printf("%-3d %-10s", p->id, p->symname);
  34. printf("Ganha de: %-8s e %s \n", p->vence1->symname, p->vence2->symname);
  35. p = p->vence1;
  36. } while (p->id != sentinela && p != NULL);
  37.  
  38. printf("\n");
  39. }
  40.  
  41.  
  42. /* Funcao que insere noh em uma lista circular duplamente encadeada */
  43. void inserir(tipoSymbol *lst, int sid, char *sname) {
  44. tipoSymbol *novo_noh; /* Ponteiro para novo noh */
  45. novo_noh = (tipoSymbol*) malloc(sizeof(tipoSymbol)); /* Aloca espaco para novo noh */
  46.  
  47. novo_noh->id = sid; /* Armazena id do novo simbolo */
  48. novo_noh->symname = sname; /* Armazena nome do novo simbolo */
  49.  
  50. novo_noh->vence2 = lst;
  51. novo_noh->vence1 = lst->vence1;
  52.  
  53. lst->vence1->vence2 = novo_noh;
  54. lst->vence1 = novo_noh;
  55. }
  56.  
  57.  
  58. /* Funcao que retira um item da lista duplamente encadeada */
  59. void remover(tipoSymbol *lst) {
  60. /* Verifica se eh o PRIMEIRO item da lista */
  61. if (lst->vence2 != NULL)
  62. lst->vence2->vence1 = lst->vence1;
  63.  
  64. /* Verifica se eh o ULTIMO item da lista */
  65. if (lst->vence1 != NULL)
  66. lst->vence1->vence2 = lst->vence2;
  67.  
  68. free(lst);
  69. }
  70.  
  71. /* Funcao para liberar espaco alocado via malloc
  72.  * para cada um dos elementos de uma lista encadeada */
  73. void liberar(tipoSymbol* lst) {
  74. tipoSymbol *f; /* Ponteiro auxiliar */
  75.  
  76. /* Faz a travessia da lista ateh encontrar o ultimo item. */
  77. while (lst != NULL) {
  78. f = lst;
  79. lst = lst->vence1;
  80. free(f);
  81. }
  82. }
  83.  
  84.  
  85. /* Funcao principal */
  86. int main() {
  87. int i, j;
  88.  
  89. /* Criar uma lista vazia */
  90. tipoSymbol *lista, *p;
  91.  
  92. /* Noh cabeca */
  93. lista = (tipoSymbol*) malloc(sizeof(tipoSymbol));
  94. lista->id = 4;
  95. lista->symname = "lagarto";
  96. lista->vence1 = lista;
  97. lista->vence2 = lista;
  98.  
  99. /* Insercao dos demais itens,
  100.   de forma circular e duplamente encadeada */
  101. inserir(lista, 0, "pedra");
  102. inserir(lista, 1, "papel");
  103. inserir(lista, 2, "tesoura");
  104. inserir(lista, 3, "spock");
  105.  
  106. /* Lista preliminar.
  107.   Apenas campo 'vence1' estah correto. */
  108. printf("-------------------------\n");
  109. printf("Lista PRELIMINAR \n");
  110. printf("-------------------------\n");
  111. imprimir(lista);
  112. printf("\n\n");
  113.  
  114. /* Lista nao-linear */
  115. p = lista;
  116. for (i=0; i<5; i++) {
  117. p->vence2 = p->vence1->vence1->vence1;
  118. p = p->vence1;
  119. }
  120.  
  121. /* Lista definitiva. */
  122. printf("-------------------------\n");
  123. printf("Lista DEFINITIVA \n");
  124. printf("-------------------------\n");
  125. imprimir(lista);
  126.  
  127. return 0;
  128. }
Success #stdin #stdout 0s 5436KB
stdin
Standard input is empty
stdout
-------------------------
Lista PRELIMINAR 
-------------------------
4   lagarto   Ganha de: spock    e pedra 
3   spock     Ganha de: tesoura  e lagarto 
2   tesoura   Ganha de: papel    e spock 
1   papel     Ganha de: pedra    e tesoura 
0   pedra     Ganha de: lagarto  e papel 



-------------------------
Lista DEFINITIVA 
-------------------------
4   lagarto   Ganha de: spock    e papel 
3   spock     Ganha de: tesoura  e pedra 
2   tesoura   Ganha de: papel    e lagarto 
1   papel     Ganha de: pedra    e spock 
0   pedra     Ganha de: lagarto  e tesoura