Sistema de informação
com alocação dinâmica de memória
//TAD personalizado typedef struct no No; typedef struct pilha Pilha; //Assinaturas dos métodos Pilha* cria(void); void push(Pilha* p, float v); float pop(Pilha* p); int vazia(Pilha* p); void libera(Pilha* p); //Criar a estrutura da pilha struct pilha { No* topo; }; //Criar a estrutura dos nós da pilha struct no { float valor; struct no* proximo; }; /* * Definir as funções BASICAS que compõe a pilha * cria - Criar a pilha e inicializar as variáveis * push - Empilha um valor no topo na pilha * pop - Desempilha um valor do topo da pilha * */ Pilha* cria(void) { Pilha* p = (Pilha*) malloc(sizeof(Pilha)); //Inicializa pilha com alocação dinâmica de memória p->topo = NULL; //Inicializa pilha com o primeiro elemento NULL return p; } void push(Pilha* p, float v) { No* no = (No*) malloc(sizeof(No)); //Aloca o tamanho de um Nó na memória no->valor = v; //Atibui um valor para o nó no->proximo = p->topo; //O elemento atual na pilha se torna o segundo elemento p->topo = no; //O novo valor se torna o topo da pilha } float pop(Pilha* p) { float valor; if (vazia(p)) { printf("Pilha vazia.\n"); exit(1); //Sai do programa } valor = p->topo->valor; //Recupera o valor do nó no topo da pilha No* no = p->topo->proximo; //Recupera o próximo nó free(p->topo); //Apaga o topo da pilha p->topo = no; //O "próximo" nó se torna agora o topo da pilha return valor; //Retorna o valor do topo antigo } int vazia(Pilha* p) {
return (p->topo == NULL); } void libera(Pilha* p){ //Libera a memória. Paga os nós e a pilha No* no = p->topo; while (no != NULL) { No* proximo = no->proximo; free(no); no = proximo; } free(p); } void imprime(Pilha* p) { //Imprime a pilha No* no; for(no = p->topo; no != NULL; no = no->proximo) printf("%f\n", no->valor); } int main() { //Teste da pilha Pilha* minhaPilha = cria(); push(minhaPilha, 9.5); push(minhaPilha, 7.0); push(minhaPilha, 4.3); pop(minhaPilha); imprime(minhaPilha);