Advertisement
Eduardo_Pires

pilha utilizando lista encadeada

Aug 28th, 2022
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.43 KB | None | 0 0
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<stdbool.h>
  4.  
  5. // declaracao do no da *lista*
  6. typedef struct node Node;
  7. struct node {
  8.     char info;
  9.     Node *next;
  10. };
  11.  
  12. // declaracao da pilha em si
  13. typedef struct pilha Pilha;
  14. struct pilha {
  15.     Node *topo;
  16. };
  17.  
  18. /*
  19. - newNode: criava um NODE da pilha
  20. - deleteNode: libera memoria de um NODE
  21.  
  22. - criar: cria uma pilha vazia
  23. - empilhar: insere elemento na pilha
  24. - desempilha: remove e retorna elemento da pilha
  25. - vazia: verifica se pilha eh vazia
  26. - cheia: verifica se pilha eh cheia
  27. - destruir: libera todas as posicoes da pilha
  28. */
  29.  
  30. Node *newNode(bool *deuCerto)
  31. {
  32.     Node *n;
  33.  
  34.     n = malloc(sizeof(Node));
  35.     if (n == NULL) *deuCerto = false;
  36.     else *deuCerto = true;
  37.  
  38.     return n;
  39. }
  40.  
  41. void deleteNode(Node *n)
  42. {
  43.     if (n != NULL) free(n);
  44. }
  45.  
  46. Pilha *criar(bool *deuCerto)
  47. {
  48.     Pilha *p;
  49.  
  50.     p = malloc(sizeof(Pilha));
  51.     if (p == NULL) *deuCerto = false;
  52.     else {
  53.         *deuCerto = true;
  54.         p->topo = NULL; // pilha vazia
  55.     }
  56.  
  57.     return p;
  58. }
  59.  
  60. bool cheia(Pilha *p)
  61. {
  62.     return false;
  63. }
  64.  
  65. void empilhar(Pilha *p, char X, bool *deuCerto)
  66. {
  67.     Node *paux;
  68.     bool ok;
  69.  
  70.     if (cheia(p) == true) *deuCerto = false;
  71.     else {
  72.         paux = newNode(&ok);
  73.         // poderia tratar o caso de ok == false
  74.         paux->info = X;
  75.         paux->next = p->topo;
  76.         p->topo = paux;
  77.         *deuCerto = true;
  78.     }
  79. }
  80.  
  81. bool vazia(Pilha *p)
  82. {
  83.     if (p->topo == NULL) return true;
  84.     else return false;
  85. }
  86.  
  87. void desempilhar(Pilha *p, char *X, bool *deuCerto)
  88. {
  89.     Node *paux;
  90.  
  91.     if (vazia(p) == true) *deuCerto = false;
  92.     else {
  93.         paux = p->topo;
  94.         *X = paux->info;
  95.         p->topo = paux->next;
  96.         deleteNode(paux);
  97.         *deuCerto = true;
  98.     }
  99. }
  100.  
  101. void destruir(Pilha *p)
  102. {
  103.     bool deuCerto;
  104.     char c;
  105.  
  106.     while (!vazia(p)) {
  107.         desempilhar(p, &c, &deuCerto);
  108.     }
  109.  
  110.     free(p);
  111. }
  112.  
  113. int main()
  114. {
  115.     Pilha *p;
  116.     bool deuCerto;
  117.     char c;
  118.  
  119.     p = criar(&deuCerto);
  120.     if (deuCerto == false) {
  121.         printf("Erro ao criar a pilha\n");
  122.         exit(1);
  123.     }
  124.  
  125.     empilhar(p, 'A', &deuCerto);
  126.     empilhar(p, 'B', &deuCerto);
  127.     empilhar(p, 'C', &deuCerto);
  128.     empilhar(p, 'D', &deuCerto);
  129.     empilhar(p, 'E', &deuCerto);
  130.  
  131.     while (!vazia(p)) {
  132.         desempilhar(p, &c, &deuCerto);
  133.         printf("%c\n", c);
  134.     }
  135.  
  136.     destruir(p);
  137.  
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement