Estou tentando fazer uma pilha alocada dinamicamente em C mas ele não está funcionando direito, não consigo enxergar onde está o erro. Não julgue muito meu código, ainda sou iniciante.
<#include <stdio.h>
#include <stdlib.h>
typedef struct elemento{
int valor;
struct elemento *anterior;
}Elemento;
typedef struct pilha{
Elemento *topo;
}Pilha
Pilha* criaPilha ();
void liberaPilha (Pilha* p);
int tamanho (Pilha* p);
int empilha (Pilha* p, int v);
int desempilha (Pilha* p);
int estahvazia (Pilha* p);
int main(){
Pilha *a;
a = criaPilha();
int x = 1, y;
do{
printf("---------------------------------\n");
printf(" ~~~~MENU~~~~\n");
printf("1. Inserir um elemento na pilha\n");
printf("2. Retirar um elemento da pilha\n");
printf("3. Tamanho da pilha\n");
printf("0. Sair\n");
printf("Opcao: ");
scanf("%d", &x);
printf("---------------------------------\n");
switch(x){
case 1:
printf("Elemento que deseja inserir: ");
scanf("%d", &y);
empilha(a, y);
printf("Elemento inserido!!\n\n");
break;
case 2:
if(estahvazia(a) == 1)
printf("Pilha vazia :(\n");
else{
desempilha(a);
printf("Primeiro elemento da pilha retirado!!\n\n");
}
break;
case 3:
printf("Quantidade de elementos na pilha: %d\n\n", tamanho(a));
break;
default:
printf("Opcao invalida\n");
break;
}
}while(x != 0);
liberaPilha(a);
return 0;
}
Pilha* criaPilha (){
Pilha *p;
p = (Pilha*) malloc(sizeof(Pilha));
if(p == NULL){
printf("Erro: memoria insuficiente\n");
system("pause");
exit(1);
}
p -> topo == NULL;
return p;
}
void liberaPilha (Pilha* p){
while(estahvazia(p) != 1){
Elemento *aux;
aux = p -> topo;
p -> topo = p -> topo -> anterior;
free(aux);
}
free(p);
}
int tamanho (Pilha* p){
int soma = 0;
Elemento *aux;
aux = p -> topo;
while(aux != NULL){
soma++;
aux = aux -> anterior;
}
return soma;
}
int estahvazia (Pilha* p){
if(p == NULL)
return 1;
if(p -> topo == NULL)
return 1;
else
return 0;
}
int empilha (Pilha* p, int v){
Elemento *aux;
aux -> valor = v;
aux -> anterior = p -> topo;
p -> topo = aux;
return 1;
}
int desempilha (Pilha* p){
if(estahvazia(p) == 1)
return 0;
Elemento *aux;
aux = p -> topo;
p -> topo = aux -> anterior;
free(aux);
return 1;
}>