Pilha dinâmica

🔋 Declarando a pilha

#include<stdio.h>
#include<stdlib.h>

typedef struct{
    int chave;
} REGISTRO;

typedef struct item{
    REGISTRO r;
    struct item *ant;
} ITEM;

typedef struct{
    ITEM *topo;
    int tam;
} PILHA;

*️⃣ Funções de manipulação da pilha

Inicializar a pilha

void inicializarPilha(PILHA *p){
    p->topo = NULL;
    p->tam = 0;
}

A variável topo recebe o valor NULL por ser tratar de um ponteiro. Já a variável tam recebe o valor 0.

Inserir (ou empilhar)

ITEM* criarItem(REGISTRO r){
    ITEM* novo = (ITEM*) malloc(sizeof(ITEM));
    if(novo){
        novo->r = r;
        novo->ant = NULL;
        return novo;
    }
    return NULL;
}
void empilhar(PILHA *p, REGISTRO r){
    ITEM* novo = criarItem(r);
    novo->ant = p->topo;
    p->topo = novo;
}

Remover (ou desempilhar)

void desempilhar(PILHA *p){
    if(p->topo){
    ITEM* deletar = p->topo;
    p->topo = p->topo->ant;
        p->tam--;
    free(deletar);
    }
}

Imprimir

void imprimir(PILHA *p){
    ITEM* pos = p->topo;
    while(pos){
        printf("%d\n", pos->r.chave);
        pos = pos->ant;
    }
}

🧑🏻‍💻 Testando a pilha

int main(void){
    PILHA p;
    inicializarPilha(&p);
    empilhar(&p, (REGISTRO){10});
    empilhar(&p, (REGISTRO){20});
    empilhar(&p, (REGISTRO){30});
    empilhar(&p, (REGISTRO){40});
    desempilhar(&p);
    empilhar(&p, (REGISTRO){50});
    imprimir(&p);
}