aula 226

Imprimindo e testando nossa estrutura de dados dinâmica PILHA

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

Deixe um comentário

18 − 2 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.