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;
}
