2
The function retiraLifo is not working and there is some syntax error, but I did not find it. This function is to remove element from the list. A insereLifo is working.
The following error occurs:
C: Users [Warning] Passing argument 2 of 'retiraLifo' makes Pointer from integer without a cast
The code:
//insere inicio retira fim
#include <stdio.h>
#include <stdlib.h>
#define SUCESSO 1
#define FALHA  -1
 typedef struct ElementoLifo   ElementoLifo;
struct ElementoLifo {
   int            dado;       // dado deste elemento
   ElementoLifo *proximo;    // elemento seguinte a este
   ElementoLifo *anterior;
};
typedef struct Lifo   Lifo;
struct Lifo {
   int          nelemen;     // nro elementos desta fila
   ElementoLifo * inicio;      // primeiro elemento desta fila
   ElementoLifo * fim;         // ultimo elemento desta fila
};
int  destroiLifo (Lifo *fila);
 int insereLifo (Lifo *fila, int dado);
 int retiraLifo (Lifo *fila, int *dado);
 Lifo *criafila();    // cria uma nova fila
int nelementos    (Lifo *fila);  // retorna nro elementos
Lifo  *criafila() {    // cria uma nova fila
   Lifo *nova = malloc( sizeof(Lifo) );
   nova->nelemen = 0;
   nova->inicio  = NULL;
   nova->fim     = NULL;
   return nova;   // retorne a nova fila criada
}
 int nelementos    (Lifo *fila) {  // retorna nro elementos
    return fila->nelemen;
}
int insereLifo (Lifo *fila,int dado ) {
    ElementoLifo *novo = malloc( sizeof(ElementoLifo));
    novo->dado = dado;
    novo->proximo = fila->inicio;
    if(fila->nelemen==0)      // 1a insercao (fila vazia) ?
        fila->fim = novo;     // se fila vazia, então novo elemento é também o fila->fim
    fila->inicio = novo;      // inserção no inicio: novo elemento é o fila->inicio
    fila->nelemen++;
    return SUCESSO;
}
int retiraLifo (Lifo *fila, int *dado) {
ElementoLifo *fim = fila->fim;
   if(fim!=NULL)  // // existe o ultimo elemento (fila não-vazia)?
   {
     *dado = fim->dado;
      fila->nelemen--;
      if((fila->nelemen)==0) { // a fila esvaziou?
            fila->inicio=NULL;
            fila->fim=NULL;
      }
      else
      if((fila->nelemen)==1) { // fila ficou com apenas 1 elemento?
            fila->fim = fila->inicio;
            fila->fim->proximo = NULL;
      }
      else  // fila ficou com mais que 1 elemento
      {
           ElementoLifo *ultimo = fila->inicio;  // procure qual será agora o ultimo elemento da fila
            while(ultimo->proximo != fim) ultimo = ultimo->proximo;
            fila->fim = ultimo;          // encontrou - ajuste os ponteiros de ligação
            fila->fim->proximo = NULL;
      }
      free(fim);   // devolva a memoria ao SO
      return SUCESSO;
   }
   else
      return FALHA;
}
int main(int argc, char const *argv[])
{ 
    Lifo *fila1 = criafila();
    printf("fila criada, nro elem=%d \n", nelementos(fila1));
    insereLifo (fila1,1 );
    printf("INSERCAO NO INICIO, nro elem=%d \n", nelementos(fila1));
    insereLifo (fila1,2 );
    printf("INSERCAO NO INICIO, nro elem=%d \n", nelementos(fila1));
    insereLifo (fila1,3 );
    printf("INSERCAO NO INICIO, nro elem=%d \n", nelementos(fila1));
    retiraLifo (fila1,3);
    printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
    retiraLifo (fila1,2);
    printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
    retiraLifo (fila1,1);
    printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
  return 0;
}
						
Ola Vilmar, update your question with the error Voce is receiving.
– Anthony Accioly
Instead of putting "[SOLVED]" in the title of the question, make the answer accepted by clicking on ✅ who is next to her. This serves not only to mark your question but also to mark which answer solved it.
– Victor Stafusa