Tenho esse código em C que permite adicionar no inicio e no fim da lista e remover do inicio da lista, precisava criar um método para remover do fim da lista, porém não estou conseguindo, alguém pode me ajudar?
typedef struct abstracao
{
int valor;
struct abstracao *prox;
}lista;
lista *inicio;
lista *aux;
lista *fim;
int op, x, contador;
void InserirInicio(int a)
{
printf(" ---- -INSERIR- ----");
struct abstracao *novo = malloc(sizeof(struct abstracao));
novo->valor = a;
if (inicio ==NULL)
{
inicio = novo;
fim = novo;
fim->prox = NULL;
}
else
{
novo->prox = inicio;
inicio = novo;
}
contador++;
}
void Apresentar()
{
if(inicio == NULL)
printf("Lista esta VAZIA.\n");
else
{
aux = inicio;
printf("\n");
while(aux!=NULL)
{
printf(" %d - ", aux->valor);
aux = aux->prox;
}printf("\n");
printf("Quantidade de elemento da lista: %d\n", contador);
}
}
void RemoverInicio()
{
aux = inicio;
inicio = aux->prox;
free(aux);
aux = inicio;
}
void InserirFinal(int a)
{
printf(" ---- - INSERIR- ----\n");
struct abstracao *novo = malloc(sizeof(struct abstracao));
novo->valor = a;
if(inicio==NULL)
{
inicio = novo;
fim = novo;
fim->prox = NULL;
}
else
{
fim->prox = novo;
fim=novo;
fim->prox = NULL;
}
}
void main()
{
inicio = NULL;
aux = NULL;
do
{
printf(" --- Digite uma opção para lista --- \n");
printf("1 - Inserir no INICIO\n");
printf("2 - Apresentar\n");
printf("3 - Remover\n");
printf("4 - Inserir FINAL\n");
printf("5 - Remover FINAL\n");
scanf("%d", &op);
switch(op)
{
case 1:
{
printf("Digite um valor para inserir na lista: \n");
scanf("%d", &x);
InserirInicio(x);
}break;
case 2:
{
Apresentar();
}break;
case 3:
{
RemoverInicio();
}break;
case 4:
{
printf("Digite um valor para inserir na lista: \n");
scanf("%d", &x);
InserirFinal(x);
}break;
case 5:
{
RemoverFinal();
}
}
}while (op<6);
}