Dando continuidade ao nosso Curso de Programação C, vamos ver nesta aula como imprimir e testar nossa estrutura de dados dinâmica do tipo PILHA.
Agora que já temos a estrutura Pessoa, a estrutura Nó e as funções para empilhar e desempilhar, precisamos testar nossa pilha. Para isso vamos desenvolver também um procedimento para imprimir nossa pilha.
Este procedimento recebe o ponteiro para o topo da nossa pilha e, quanto topo for diferente de NULL, imprime as informações de cada Pessoa, como apresentado a seguir.
// procedimento para imprimir toda a pilha void imprimir_pilha(No *topo){ printf("\n----------- PILHA --------------\n"); while(topo){ imprimir_pessoa(topo->p); topo = topo->proximo; } printf("\n--------- FIM PILHA ------------\n"); }
A seguir temos o código completo com todas as estruturas, funções e procedimentos que desenvolvemos ao longo das últimas aulas.
Código completo em C para a estrutura de dados dinâmica Pilha
/* Aula 226: Estruturas de dados dinâmicas Código escrito por Wagner Gaspar Julho de 2021 */ typedef struct{ int dia, mes, ano; }Data; typedef struct{ char nome[50]; Data data; }Pessoa; typedef struct no{ Pessoa p; struct no *proximo; }No; Pessoa ler_pessoa(){ Pessoa p; printf("\nDigite nome e data de nascimento dd mm aaaa:\n"); scanf("%49[^\n]%d%d%d", p.nome, &p.data.dia, &p.data.mes, &p.data.ano); return p; } void imprimir_pessoa(Pessoa p){ printf("\nNome: %s\nData: %2d/%2d/%4d\n", p.nome, p.data.dia, p.data.mes, p.data.ano); } // função para a operação push (empilhar) No* empilhar(No *topo){ No *novo = malloc(sizeof(No)); if(novo){ novo->p = ler_pessoa(); novo->proximo = topo; return novo; } else printf("\nErro ao alocar memoria...\n"); return NULL; } // função para a operação pop (desempilhar) No* desempilhar(No **topo){ if(*topo != NULL){ No *remover = *topo; *topo = remover->proximo; return remover; } else printf("\nPilha vazia!\n"); return NULL; } void imprimir_pilha(No *topo){ printf("\n----------- PILHA --------------\n"); while(topo){ imprimir_pessoa(topo->p); topo = topo->proximo; } printf("\n--------- FIM PILHA ------------\n"); } int main(){ No *remover, *topo = NULL; int opcao; do{ printf("\n0 - Sair\n1 - Empilar\n2 - Desempilhar\n3 - Imprimir\n"); scanf("%d", &opcao); getchar(); switch(opcao){ case 1: topo = empilhar(topo); break; case 2: remover = desempilhar(&topo); if(remover){ printf("\nElemento removido com sucesso!\n"); imprimir_pessoa(remover->p); free(remover); } else printf("\nSem no a remover.\n"); break; case 3: imprimir_pilha(topo); break; default: if(opcao != 0) printf("\nOpcao invalida!!!\n"); } }while(opcao != 0); return 0; }